Git - 冲突解决

git merge

merge 这种分支合并操作会把当前分支和要被merge的分支上的提交交叉合并,比如如下的分支情况:

              A---B---C master on origin
             /
        D---E---F---G master
            ^
            origin/master in your repository

在执行了merge操作后会变成这样:


              A---B---C origin/master
             /         \
        D---E---F---G---H master

把远程分支 origin/master 上的HEAD(C)和本地分支上的HEAD(G)执行 merge 后形成H提交,作为当前的HEAD。

常见使用方式如下:

git fetch origin
git merge origin/master

git rebase

rebase是另外一种形式的分支合并操作,从名字上也可以窥探其一二,Re-Base 含义就是重定向本地分支的Base提交,还拿上面的情况做解释,当前分支如下:

              A---B---C master on origin
             /
        D---E---F---G master
            ^
            origin/master in your repository

rebase 操作第一步会先从E处移除本地分支的提交,重定向找到被 rebase 的远程分支的新HEAD,也就是C:

              A---B---C master on origin
             /
        D---E         F---G master
            ^
            origin/master in your repository

然后把要被 rebase 的远程分支 origin/master 进行更新,一直更新的新的HEAD(C)处,然后把本地的提交在新base上进行应用。

              A---B---C master on origin
             /          \
        D---E            F---G master
            ^
            origin/master in your repository

到最后就是如下的一个直线式的提交记录:


        D---E---A---B---C---F---G master
                        ^
                        origin/master in your repository

常见使用方式如下:

git fetch origin
git rebase origin/master

冲突解决

当执行 merge 或者 rebase 时都可能会遇到冲突的情况,所谓冲突的产生是怎么来的呢?因为本地的修改恰好和服务器上其他人的修改冲突了,那么合并时就不知道以谁的为准,所以需要进行解决。

比如本地仓库分支上在commit A后面有一个人的commit B,而服务器上已经合入了其他人的提交commit C, 这个 commit C 恰好也是在 commit A 后面合入的,并且恰好两者都修改了同一个文件的同一行,那么就产生了冲突。

那么本地在进行merge或者rebase时就会上报冲突,需要本地解决后才可以提交。

edk2$ git merge origin/bsp
自动合并 QcomModulePkg/Library/BootLib/UpdateCmdLine.c
冲突(内容):合并冲突于 QcomModulePkg/Library/BootLib/UpdateCmdLine.c
Recorded preimage for 'QcomModulePkg/Library/BootLib/UpdateCmdLine.c'
自动合并失败,修正冲突然后提交修正的结果。

edk2$ git status
位于分支 master
您有尚未合并的路径。
  (解决冲突并运行 "git commit")

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

	双方修改:   QcomModulePkg/Library/BootLib/UpdateCmdLine.c

merge 失败后使用 git status 可以查看冲突文件有哪些,打开冲突文件,冲突的部分由如下标志指定:

 <<<<<<< HEAD
         *Status = 0;
 =======
         *Status = 1;
 >>>>>>> origin/bsp

HEAD表示当前分支上的修改,下面的部分是被merge的分支上的修改,两者不一样,所以要选择一个作为最终修改值,比如删掉远程分支上的修改,只保留如下修改:

  *Status = 0;

完成后,需要执行 git add 把冲突文件加入的提交列表,然后 git commit 完成merge 操作:

git add QcomModulePkg/Library/BootLib/UpdateCmdLine.c
git commit

至此,我们就完成了冲突的解决,对于rebase形式的冲突解决,方法也是一样的。

你可能感兴趣的:(Git,Tips)