如果我去终端并写入:
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 <
\
E<-F<-G <
分支名
master
和
test
实际上包含了这两个分支末端的原始哈希ID。也就是说,如果你检查文件
.git/refs/heads/master
1,你会在其中找到一个像
a139fc7...
这样的40个字符的哈希值。
实际上,master
指向提交D
,而test
指向G
。提交D
指向提交C
,C
又指向B
,以此类推;而提交G
则指向F
,F
又指向E
,E
再指向B
(由于某些良好的绘制箭头字体只能在某些机器上使用,因此在此处使用纯文本绘制箭头过于复杂)。
当你位于某个分支并做出一个新的提交时,Git创建此提交的方式是:将其父提交设置为当前分支的末端,并且一旦新提交安全地存储在仓库中,就会重写分支的名称文件,使分支名指向新的末端。新的ID不会去到其他任何地方,因此其他分支的名称不会以任何方式更改。
合并提交有两个父提交,因此当你运行git merge test
并且它运行成功时,你将得到以下结果:
...--o--o--o--o---o <-- master
\ /
o--o--o <-- test
注意,
test
一点都没有移动,但是
master
移动了—— 新的合并提交指向两个不同的早期提交:旧的分支顶部
master
和 (不变的)
test
顶部。
1不能保证这个文件将来会存在,或者停留在这个位置或者保持这种格式,但现在,在今天的Git版本中,通过2.10,通常会有这个文件。
git checkout test
git merge master
...翻译为:除非您将主分支合并到测试分支,否则它将保持不变。 - n00dl3