`
songkang666
  • 浏览: 107067 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Git step by step 10 之merge

    博客分类:
  • GIT
 
阅读更多
        总的来讲,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
分享到:
评论
1 楼 cuqing 2016-03-28  
分析得简明易懂,推荐阅读。

相关推荐

    Git-2.21.0-64-bit.zip

    * The "git log" command by default behaves as if the --mailmap option was given. UI, Workflows & Features * The "git fast-export/import" pair has been taught to handle commits with log messages...

    git.docx教程

    git merge dev ``` - **删除分支**:移除不再使用的分支。 ```shell git branch -d dev ``` #### 远程仓库操作 - **SSH密钥生成**:用于安全地访问远程仓库。 ```shell ssh-keygen ``` - **推送分支到...

    Pro Git入门

    10. **Git与其他工具集成**:Git可以与许多开发工具(如Visual Studio Code、IntelliJ IDEA、Atom等)无缝集成,书中会介绍如何配置和使用这些集成。 总的来说,《Pro Git入门》是一本全面且深入的Git教程,无论你...

    在Perl模块上逐步创建带有测试和git的教程:从底层进行Perl模块开发,并逐步进行测试过程和git集成

    在“step-by-step-tutorial-on-perl-module-creation-with-tests-and-git-master”这个文件列表中,我们可以期待找到一个详细的教程,包含了创建Perl模块的步骤、如何编写测试以及如何使用Git进行版本控制。...

    git第一步

    如果你看到名为"git-firststep-master"的压缩包,里面可能包含了一个关于Git基础操作的教程项目,包括示例文件和练习,帮助初学者逐步掌握Git的使用。 总的来说,了解和熟练掌握Git的基本操作是每个开发者必备的...

    SourceTreeSetup-win3.3.8_mac4.0.1.zip

    Step 1: Create a Git repository Step 2: Copy your repository and add files Step 3: Pull changes from your repository Step 4: Use Sourcetree branches to merge an update

    基于JAVA的打飞机游戏设计与源码实现

    12. **版本控制**:项目中可能使用Git进行版本管理,开发者需要了解Git的基本操作,如commit、push、pull、branch和merge。 通过这个项目,开发者不仅可以提升Java编程技能,还能学习到游戏开发的基本流程和技巧,...

    飞鸽安卓源码

    源码很可能使用了Git进行版本控制,因此理解Git的工作流程,如clone、branch、merge、commit、push等命令,对于协同开发和代码管理至关重要。 9. **构建与打包**: Android项目通常使用Gradle作为构建工具,理解...

    GCD_CourseProjectPasBesoin:获取和清理数据课程的课程项目

    这个目录会被 Git 忽略,不会被添加到 repo 中。 跑步 只有一种脚本。 像这样运行它: R CMD BATCH run_analysis.R 它会生成一个名为gcd_course_project_tidy_means.txt (我也单独上传)的输出文件。 您可以像...

Global site tag (gtag.js) - Google Analytics