Git 合并 - 合并的分支会发生什么情况



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

git checkout master
git pull origin master

这会用最近添加的东西更新我的主分支,对吗?然后,我完成了我在测试分支中正在做的事情。
如果我去终端写:

git checkout master
git merge test
git push origin master

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

git checkout test
git pull origin master
git push origin test

提前谢谢。

如果我去终端写:

git checkout master
git merge test
git push origin master

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

什么都没有。

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

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

每个提交都"指向"其父提交 - 因此,如果我们为每个提交中的每一个提供一个字母名称,并绘制所有中间箭头,我们将得到:

...<-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(在这里用纯文本绘制箭头太棘手了,因为一些好的箭头绘制字体仅适用于某些机器(。

当您在某个分支上进行提交时,Git 进行此提交的方式是,它将新提交及其父项集写入当前分支提示,然后在新提交安全地进入存储库后,使用新提交的 ID 重写分支名称文件。 这使分支名称指向新提示。 新 ID 不会在其他任何地方使用,因此不会以任何方式更改其他分支名称。

合并提交有两个父级,因此当您git merge test并且它起作用时,您会得到以下内容:

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

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


1不保证此文件将来会存在,或者保留在此位置或具有此格式,但是现在,从今天的 Git 版本到 2.10,您通常会拥有该文件。

相关内容

最新更新