Git合并 - 合并分支会发生什么?

时间:2016-10-04 09:17:41

标签: git github merge branch

我有一个关于git合并的问题。让我们说我的存储库中有两个分支(本地和远程):master和test。当我在测试分支上工作时,主分支由其他人更新。在终端,我写道:

Before : Hello World
In function: Hexlo World
After : Hexlo World

这会用最近添加的内容更新我的主分支吗?然后,我完成了我在测试分支中所做的工作 如果我去终端写信:

git checkout master
git pull origin master

这会将我的测试分支合并到我的主分支中,然后将更改推送到github(让我们假设没有冲突)?我的问题是:测试分支会发生什么?它是否与合并前的方式保持一致?或者测试和主分支是否相同?我现在应该这样做来更新测试分支吗?

git checkout master
git merge test
git push origin master

提前致谢。

1 个答案:

答案 0 :(得分:5)

  

如果我去终端写信:

git checkout master
git merge test
git push origin master
     

这会将我的测试分支合并到我的主分支中,然后将更改推送到github(让我们假设没有冲突)?我的问题是:测试分支会发生什么?

什么都没有。

请记住,分支名称只是(单个)提交的名称。为了绘制它们,我喜欢将提交本身作为圆形o节点或大写单个字母绘制,当我们需要讨论特定提交时,使用连接它们的线:

...--o--o--o--o      <-- master
         \       
          o--o--o    <-- test

每次提交&#34;指回&#34;到它的父提交 - 所以如果我们给每个提交一个字母名称,并绘制所有中间箭头,我们得到:

...<-A<-B<-C<-D      <-- master
         \
          E<-F<-G    <-- test

分支名称mastertest实际上包含两个分支的提示的原始哈希ID。也就是说,如果您检查文件.git/refs/heads/master 1 ,您将在其中找到其中一个非常丑陋的40个字符的哈希,a139fc7...或其他内容。

实际上,master指向提交Dtest指向G。将D点提交回提交C,返回B,依此类推;并将G点提交回F,指向E,指向B(用纯文字绘制箭头太棘手了)这里,因为一些好的箭头绘制字体只适用于某些机器。)

当您在某个分支上进行 new 提交时,Git进行此提交的方式是将新提交的父设置写入当前分支提示,并且然后,一旦新提交安全地存储在存储库中,则使用新提交的ID重写分支 name 文件。这使得分支名称指向新的提示。新ID无处可去,因此其他分支名称无论如何都不会改变。

合并提交有两个父母,所以当你git merge test并且它有效时,你会得到这个:

...--o--o--o--o---o  <-- master
         \       /
          o--o--o    <-- test

请注意test根本没有移动,但master有 - 并且新的合并提交指向两个不同的早期提交:master的旧分支,以及test的(未更改的)提示。

1 没有承诺将来会存在这个文件,或者留在这个位置或拥有这种格式,但是现在,通过今天的Git版本2.10,您通常会有该文件。