我有一个关于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
提前致谢。
答案 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
分支名称master
和test
实际上包含两个分支的提示的原始哈希ID。也就是说,如果您检查文件.git/refs/heads/master
1 ,您将在其中找到其中一个非常丑陋的40个字符的哈希,a139fc7...
或其他内容。
实际上,master
指向提交D
,test
指向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,您通常会有该文件。