总的来讲,git merge是对分支进行操作的,将两个分支进行合并。
先上图1:
对图1的解释:
首先是进行了两次提交commit 1和commit 2,此时,发现问题(假设为1号问题),故建立分支issue 1。此时有了issue 1分支,在此分支下可以进行解决1号问题。
然而,在解决1号问题时突然发现,项目需要添加一个重要的文件,需要切换到master分支,并新建hotfix分支以完成这个添加的动作(当然,也可以直接在master分支下进行添加,但若需要进行恢复,新建hotfix分支的方式似乎使得这个操作更容易些),即做“commit 3”这个提交。
在hotfix分支下,添加了文件之后,我们需要继续切换回issue1分支以解决1号问题。即做“commit 3’”和“commit 4’”这两个提交。
一、快进(Fast Forward)
当前分支合并到另一分支时,如果没有分歧解决,就会直接移动文件指针。这个过程叫做fast forward。 举例来说,开发一直在master分支进行,但忽然有一个新的想法,于是新建了一个develop的分支,并在其上进行一系列提交,完成时,回到 master分支,此时,
master分支在创建develop分支之后并未产生任何新的commit。此时的合并就叫fast forward。
在最开始的图1中,将hotfix合并到master(即,使得master与hotfix同指向),即为fast forward,运行以下命令:
git checkout master
git merge hotfix
如图2:
你还可以用git branch -d hotfix 把 hotfix 分支删除。
示例: 1. 新建一个work tree,在master中做几次commit 2. 新建develop的branch,然后再做多次commits 此时的分支流图如图3(gitx):
正常合并
(master)$ git merge develop
Updating 5999848..7355122
Fast-forward
c.txt | 1 +
d.txt | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 c.txt
create mode 100644 d.txt
图4
可以看出这是一次fast-forward式的合并,且合并完之后的视图为扁平状,看不出develop分支开发的任何信息。
使用–no-ff进行合并
—no-ff (no fast foward),
使得每一次的合并都创建一个新的commit记录。即使这个commit只是fast-foward,用来避免丢失信息。
(master)$ git merge –no-ff develop
Merge made by recursive.
c.txt | 2 +-
d.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
图5
可以看出,使用no-ff后,会多生成一个commit 记录,并强制保留develop分支的开发记录(而fast-forward的话则是直接合并,看不出之前Branch的任何记录)。这对于以后代码进行分析特别有用。
二、基本合并
在问题1解决之后,可以合并回master分支,实际操作同前面的hotfix分支差不多,只需检出想要更新的分支(master),并运行git merge命令指定来源:
git checkout master
git merge issue1
请注意,这次合并的实现,并不同于前面hotfix 的并入方式。这一次,Git 会用两个分支的末端commit 3 和 commit 4’和它们的共同祖先 commit 2 进行一次简单的三方合并计算。然后,Git对三方合并的结果作一新的快照,并自动创建一个指向它的 commit 5(见图6)。
Ps: Git 可以
自己裁决哪个commit 是他们最佳的合并基础(这里是commit 2,也就是分叉的地方)。
三、带冲突的合并
如果你在两个分支中都修改了
同一个文件的同一部分,合并时就会出现冲突,Git就无法自动将两者合在一起,只能由人来解决。
依旧用我们的图2,假设在commit 2时,创建了一文件test.txt,而在commit 3及commit 3’中都进行了对test.txt的第一行进行了操作,那么在进行git merge issue1时,会提示有冲突:
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
当输入git log --all --graph --oneline,你会发现,并没有创建新的commit(区别于上一部分的“基本合并”,由于其成功合并,会创建一个新的commit),而在工作目录中的test.txt文件里,包含冲突部分及提示,此时需要你手工地进行修改(vi test.txt),然后git add test.txt以及 git commit -m "merge XXXX",即可,图示同图6.
more:
Git 101 – Fast Forward
《pro git》
《Git Community Book 中文版》 分支与合并@基础
- 大小: 10 KB
- 大小: 10.4 KB
- 大小: 10.9 KB
分享到:
相关推荐
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...
git merge tools
Learn Version Control With Git A step-by-step course for the complete beginner(中文)。亚马逊接近满分书籍,中文版。图文并茂。学习Git的好资料。 从官网一页一页的复制过来的,花了不少时间。
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
最新git项目开发中一键发起merge request工具,自动识别本地环境,支持windows、Linux、Mac,包含使用教程和资料。 非常简单的使用,下载脚本后,根据教程进行简单的配置,根据自己的操作系统类型,把注释部分选用...
前端大厂最新面试题-git rebase_ git merge.docx
Git_版本管理_#8_分支冲突_(merge)_(教学_教程_tutorial)
"Learn Version Control with Git" is a beginner-friendly step-by-step course. The book doesn't require a deep technical background. Instead, it's aimed at beginners of version control and/or ...
主要介绍了详解git merge 与 git rebase的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
P4Merge, Linux上最好用的merge工具,附git标准集成说明
主要介绍了详解git merge命令应用的三种情景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
git视频教程.1.Git 命令 - git help、git config.mp4 ...git视频教程.10.Git 命令 - git svn、git fast-import.mp4 git视频教程.11.Git 命令 - git gc、git fsck、git reflog.mp4 git视频教程.12.Git 命令 - 总结.mp4
因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助...
gti详细的分支操作,在git中,可以使用git merge 和git rebase两个命令来进行分支的合并。 git merge 和git rebase在大体上都差不多,下文主要以git merge来例来讲解分支的合并流程。 如果你想了解分支合并的更多...
Git Mergetool Vimdiff 包装器 这是什么? 修改 git mergetool vimdiff 的 BAD UI(当 git 的 BASE 不存在时,UI 会发生变化)。 总是合并疼痛是底部! 设置 git clone ...
git-merge-driver:如何配置自定义git合并驱动程序的示例
vim 配置文件,包含作为git merge 工具时候的配置文件
因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助...
Git详解之一 Git起步.doc Git详解之二 Git基础.doc Git详解之三 Git分支.doc Git详解之四 服务器上的Git.doc Git详解之五 分布式Git.doc Git详解之六 Git工具.doc Git详解之七 自定义Git.doc Git详解之八 Git与其他...