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
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形式的冲突解决,方法也是一样的。