总的来讲,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 merge` 是 Git 中的一个核心命令,用于将两个或多个分支的更改合并到一起。这个过程是 Git 工作流程的重要部分,有助于保持代码的同步和一致性。在本文中,我们将深入探讨 `git merge` 工具及其在实际操作中的...
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...
git rebase 和 git merge 的理解与区别 Git 是一个版本控制系统,广泛应用于软件开发过程中。其中,git rebase 和 git merge 是两个常用的命令,都是用于合并分支,但是它们的实现机制和应用场景却有所不同。 git...
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Merge made by the 'recursive' strategy. test-2.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) ``` 合并完成后,因为dev分支已经被合并到master分支中,所以可以删除dev分支: ```bash $ git ...
P4Merge是一款强大的可视化三向合并工具,尤其在Linux环境中,它被广泛认为是最佳的merge工具之一。由Perforce公司开发,P4Merge以其清晰的界面、强大的冲突解决能力和高效的工作流程而受到开发者们的喜爱。本文将...
Git 是一个分布式版本控制系统,它提供了两种合并分支的策略:`git merge` 和 `git rebase`。两者都是为了整合不同分支的更改,但它们在处理合并的方式上有显著的差异。 ## Git Merge `git merge` 是最常见的合并...
Sublime Merge的核心功能之一是它的可视化冲突解决工具。通过图形化界面,用户可以清晰地看到代码冲突的位置,直观地比较差异,并选择保留或忽略特定更改。这对于处理复杂的代码合并问题非常有帮助。 **2. 强大的...
最新git项目开发中一键发起merge request工具,自动识别本地环境,支持windows、Linux、Mac,包含使用教程和资料。 非常简单的使用,下载脚本后,根据教程进行简单的配置,根据自己的操作系统类型,把注释部分选用...
Git LFS,全称为Git Large File Storage,是一个用于解决Git在处理大文件时效率和存储问题的工具。Git本身设计时主要关注小文本文件的版本控制,而对于图像、音频、视频等大型二进制文件,Git的性能会显著下降,因为...
"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视频教程.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
10. **Git Rebase**:`git rebase`是一个更高级的合并策略,它将一个分支的变更应用到另一个分支的历史之上,创造出一个连续的提交历史。`git rebase`可以使分支看起来像是直接在目标分支上发展,使得历史线更加简洁...
为了更好地利用Git,开发者需要掌握基本的Git命令和工作流程,例如,了解如何创建和切换分支(`git checkout -b`),如何解决合并冲突(`git diff`、`git merge --abort`或`git mergetool`),以及如何回退到之前的...
因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助...
Sublime Merge 是Sublime Text制作者开发的一款Git客户端。 Sublime Merge 集成合并工具,强大的搜索功能,无与伦比的性能。可以保留你的文件和历史记录,命令面板和热键绑定。支持光明与黑暗主题,可扩展性,语法...
在某些情况下,用户可能需要处理特殊的文件格式或者需要自定义合并策略,这时Git的自定义合并驱动程序(git merge driver)就派上用场了。本教程将深入讲解如何配置自定义的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 ...