我有一个关于 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
分支名称 master
和 test
实际上包含两个分支尖端的原始哈希 ID。 也就是说,如果你检查文件.git/refs/heads/master
1,你会发现里面有一个丑陋的 40 个字符的大哈希,a139fc7...
或其他什么。
实际上,master
指向提交D
,test
指向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,您通常会拥有该文件。