3

更新:这原来是我正在使用的 SmartGit 版本(版本 3.0.11)中的一个错误 - 一个类似于 gitk 的应用程序。“可推送提交”列表在执行“git pull”后被修改,一些尚未推送的本地提交被意外地从该 UI 列表中删除。这导致了这篇文章中描述的混乱,似乎唯一没有被推送的提交是“合并提交”。


我将更改推送到远程(在 GitHub 上)。另外两个开发者在我之后提交了一些提交。我绝对没有本地更改或提交,并且做了一个“git pull”。

立即,在它撤下更改后,它迫使我进行合并提交(允许我键入可选消息)。我已经使用 Git 大约 2 年了,但我还没有遇到过将更改拉入干净的本地存储库会强制合并提交的情况。这在过去一周发生了两次,我不确定该怎么做,所以我两次都立即推送了这个合并提交,没有任何问题(!?)。

在我们的团队中,我们有一些喜欢变基的开发人员和其他使用 git pull 的开发人员。我想知道它是否可能相关(即使我们已经进行了一年多的设置,而一周前我还没有遇到过这种情况)。我使用 git pull。

下图显示了历史。

合并提交

我推送的原始提交是紫色线上的底点。其他两个开发人员追随我,在拉动他们的更改后,它在我的本地存储库中创建了顶部的“合并分支”提交(在同一条紫色线上)。

4

2 回答 2

1

在看了你的照片更长时间之后,我意识到了一些明显的事情。让我们从下到上命名提交 A 到 E 以使其更容易。

所以事情是这样的:在拉取之前,您的本地分支指向A您在本地进行的提交。

但是,在查看提交 D 时,您可以看到红线并未结束,A而是在之前的某个位置(屏幕截图未显示)。因此,该提交不是基于,A因此您在拉动时无法快进。您必须改为创建合并提交。

现在你提到你之前确实推送A过,所以这有点奇怪。如果你真的推送它并且D已经发布了,你的推送就会失败,你必须先合并它。如果D尚未发布,则您的推送将通过,但作者D必须合并它才能推送。

由于这两种情况都没有发生,并且您必须稍后在拉取时创建合并,所以剩下的唯一原因是您实际上从未推送过您的 commit A

请注意,提交不会自动推送提交。正如我在评论中所说,除非您推/拉,否则您所做的一切都是完全本地的。并且只有当您进行推送或拉取时,提交才会真正传输到远程或从远程传输。

(另一种选择是开发推送D 确实发生了冲突,但选择强制推送,从远程存储库中删除您的提交。如果您使用的是 GitHub,这应该可以从该用户的活动日志中看到。)

于 2013-10-25T15:18:08.440 回答
0

重要的是要记住这是git pull两个命令的组合。git fetch并且git commit 您的本地主分支与远程主分支不是同一个分支。

在您推送更改后,有人将更改推送到远程分支。因此,当您从遥控器中拉出时。Git 更新了HEAD远程分支,然后将其合并到您的本地分支中。合并会导致提交发生,因此您最终将获得合并提交。

如果您已将分支重置为最初推送的提交,然后git pull --reabse您会发现其他开发人员添加的提交将与您的分支一致,您将不会有合并提交。

通常,这些合并提交是良性的,但有时它们会引起一些麻烦。

根据您的评论,当您推送时,您的本地提交比远程提交了一个或多个。在你推动之后,它们是等价的。

于 2013-10-25T15:09:32.303 回答