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的使用场景
就是合并分支
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
小总结:
merge
的含义:从两个commit
「分叉」的位置起,把目标commit
的内容应用到当前commit
(HEAD
所指向的commit
),并生成一个新的commit
;- merge的适用场景:
- 单独开发的
branch
用完了以后,合并回原先的branch
; git pull
的内部自动操作。
- 单独开发的
- merge的三种特殊情况:
- 冲突
- 原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;
- 应对方法:解决冲突后手动
commit
。
HEAD
领先于目标commit
:Git 什么也不做,空操作;HEAD
落后于目标commit
:fast-forward。
- 冲突
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!