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

Tir*_*esi 2 git merge branch github

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

git checkout master
git pull origin master
Run Code Online (Sandbox Code Playgroud)

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

git checkout master
git merge test
git push origin master
Run Code Online (Sandbox Code Playgroud)

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

git checkout test
git pull origin master
git push origin test
Run Code Online (Sandbox Code Playgroud)

提前致谢.

tor*_*rek 5

如果我去终端并写:

git checkout master
git merge test
git push origin master
Run Code Online (Sandbox Code Playgroud)

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

什么都没有.

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

...--o--o--o--o      <-- master
         \       
          o--o--o    <-- test
Run Code Online (Sandbox Code Playgroud)

每个提交"指回"到其父提交 - 所以如果我们给每个提交一个字母名称,并绘制所有中间箭头,我们得到:

...<-A<-B<-C<-D      <-- master
         \
          E<-F<-G    <-- test
Run Code Online (Sandbox Code Playgroud)

分支的名称,mastertest,实际上包含两个分支的末端的原始哈希标识.也就是说,如果你检查文件.git/refs/heads/master1,你会发现其中有一个丑陋的40个字符的哈希值,a139fc7...或其他内容.

实际上,master指向提交D,并test指向G.提交D点返回提交C,指向返回B,等等; 然后G返回F指向的点,返回E指向的点B(在这里用纯文本绘制箭头太麻烦了,因为一些好的箭头绘制字体只适用于某些机器).

当你在某个分支上并进行新的提交时,Git进行此提交的方式是它将新的commit与其父集写入当前的branch-tip,然后一旦新的commit在存储库中安全地重写,就会重写具有新提交ID 的分支名称文件.这使得分支名称指向新的提示.新ID无处可去,因此其他任何分支名称都不会发生任何变化.

合并提交有两个父母,所以当你git merge test和它工作时,你得到这个:

...--o--o--o--o---o  <-- master
         \       /
          o--o--o    <-- test
Run Code Online (Sandbox Code Playgroud)

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


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