Git Merge

此篇介绍Git操作之merge。

Git merge:合并 commits

merge 的意思是「合并」,它做的事也是合并: 指定一个 commit ,把它合并到当前的 commit 来。具体来讲, merge 做的事是:从目标 commit 和当前 commit (即 HEAD 所 指向的 commit )分叉的位置起,把目标commit 的路径上的所有 commit 的内容一并应用到当前 commit ,然后自动生成一个新的commit。

一般来说在master上操作: git merge branch 这样branch会合并到master上,实际操作是两者均延伸出一个新commit进行相交。

merge的使用场景

  1. 就是合并分支

  2. pull的内部操作:pull的实际操作其实是把远端仓库的内容用fetch取下来之后,用merge来合并。

特殊情况1:冲突

首先两个分支改了同一个文件不同地方,merge会自动合并。但是该了相同地方就会产生冲突。他会提示你那里冲突。现在我们就需要做两件事情:1. 解决冲突; 2. 手动commit一下

对于前者来说:再打开冲突文件看一下。内容会改变。Git虽然无法处理冲突,但是他把两个分支冲突的内容放在一起,并用符号标记出他们的边界以及出处。

我们如何操作呢?假设你要保留HEAD的修改,那么只要删除feature1的修改,再把辅助文字符号删除,保存退出就可以。 (当然也可以选择更方便的merge工具来解决冲突。

对于后者来说:解决完冲突之后就要进行第二步,commit了。commit冲突文件。被冲突中断的merge在手动commit时候依旧会自动填写提交信息不用奇怪。我们先前的Git仓库都处于冲突待解决的中间状态,如果不解决冲突,也可以选择merge --abort来手动取消merge以达到merge前的状态。

特殊情况2:HEAD领先于目标commit

merge时,目标commit和HEAD处commit不存在分叉,而是单纯一条线上,且HEAD领先目标commit。此情况merge空操作。

特殊情况3:HEAD落后于目标commit (fast-forward

Git会直接把HEAD以及他所指向的branch移动到目标commit。也就是前移罢了。看似此情况很少见,其实这种情况十分常见。因为这其实就是pull操作的一种经典:本地的master没有新提交,而远端仓库中有同事提交新内容到master。如果这时候在本地执行一次pull操作,就会由于HEAD落后于目标commit(也就是origin master)而造成fast-forward。而 git pull 的第二步操作 merge 的目标 commit ,是远端仓库的 HEAD,也就是 origin/HEAD ,所以 git pull 的第二步的完整内容是:git merge origin/HEAD

小总结:

  1. merge 的含义:从两个 commit「分叉」的位置起,把目标 commit 的内容应用到当前 commitHEAD 所指向的 commit),并生成一个新的 commit
  2. merge的适用场景:
    1. 单独开发的 branch 用完了以后,合并回原先的 branch
    2. git pull 的内部自动操作。
  3. merge的三种特殊情况:
    1. 冲突
      1. 原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;
      2. 应对方法:解决冲突后手动 commit
    2. HEAD 领先于目标 commit:Git 什么也不做,空操作;
    3. HEAD 落后于目标 commit:fast-forward。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!