我有一个新手git问题。让我们说我的存储库图片就像这样开始:
A <-- B <-- MASTER | A <-- B <-- O/M
我对本地主人进行了一些更改,同时有人也更新了远程主人。所以我有:
A <-- B <-- C <-- D <-- MASTER | A <-- B <-- E <-- F <-- O/M
现在我变得胡思乱想并做了一个'git pull'。根据我的理解,我现在应该看到:
O/M
|
V
---- E <-- F ------
| |
V ^
A <-- B <-- C <-- D <-- G <-- MASTER | A <-- B <-- E <-- F <-- O/M
到目前为止我是对的吗?现在我决定git push to remote master。我不太确定我应该在遥控器上看到什么样的图表。是吗:
A <-- B <-- E <-- F <-- G <-- O/M
看起来不对劲。或是它:
A <-- B <-- C <-- D <-- G <-- O/M
那个人也不能说服我。
我已经阅读过git push只有在远程可以与您尝试推送的内容进行快进合并时才有效。我无法调和该声明与遥控器上的最终图形应该是什么样的。
答案 0 :(得分:4)
故障:
我读过git push只有在遥控器可以快速合并你试图推送的东西时才有效。
这是分支更新的默认约束(对refs/heads/whatever
形式的引用的更新)。遥控器可以建立其他规则,但这可能是有效规则。
值得注意的是,&#34;快进&#34;实际上是标签移动的属性,而不是合并本身。 git merge
命令选择在可能的情况下执行快进,而不是以其他方式告知,这确实称为&#34;快进合并&#34;在不同的地方(虽然git merge
手册页说&#34;当合并解决为快进&#34;时,这是一个微妙的区别。)
我...做一个&#39; git pull&#39;
拉动脚本是:
的简写让我们假设&#34;合并&#34;。不过你画的图表,让我这样写:
C - D <-- master@{1}
/ \
A - B G <-- master
\ /
E - F <-- origin/master
其中G
是合并提交,G^
是D
,G^2
是F
,依此类推。 (这也可以画出来:
A - B - C - D - G
\ /
E - F
但是这会使master@{1}
标签更难上贴。)
理解这一点的一个关键是,我向右推的标签纯粹位于你的存储库中,它们只是标签。 (通过&#34;只是标签&#34;我的意思是它们不像存储库对象提交的方式那样是永久性的,而且每个提交的东西都是永久的。它们可以&#34;剥离&#34;,就像标签一样写在便签上,稍后粘贴在其他不同的物体上,甚至扔掉。)
现在,如果你做git push
,你的git会联系他们的git,两人会谈谈他们有什么。你的话说:&#34;我想让你提交G
并在那里refs/heads/master
点。&#34;
他们接着说:&#34;我对G
一无所知,告诉我更多信息!&#34;您将G
描述为指向D
和F
;他们知道F
但不知道D
,所以你的人告诉他们关于D
指向C
,然后关于C
指向B
,现在这两个人都赶上了。 1
此时,他们可以查看提案,将refs/heads/master
更新为G
并确定是否将master
从F
移至G
将是一个快进的人。它会,所以他们会接受它,并让他们的master
分支点提交G
。
在这个过程中,你的git实际上并没有告诉他们你的master
分支!它只是说&#34;我希望你指出你的master
提交G
&#34;。然后,他们只是想看看他们是否快进。
1 当然,除此之外还有更多内容:&#34;对话&#34;,例如它,实际上是关于git对象,当你的对象通过提交发送它还必须发送任何所需的树和blob对象。标签更新也会在之后发生。但总的来说,这就是效果。