使用干净的本地存储库进行 git pull 会导致合并提交

问题描述 投票:0回答:2

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


我将更改推送到远程(在 GitHub 上)。另外两名开发人员在我之后推送了一些提交。我绝对没有进行任何本地更改或提交,并执行了“git pull”。

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

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

下图显示了历史。

Merge commit

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

git git-merge git-rebase git-pull
2个回答
1
投票

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

所以事情是这样的:在拉取之前,您的本地分支指向

A
,这是您在本地进行的提交。

但是,当查看提交 D 时,您可以看到红线并非以

A
结尾,而是在之前的某处(屏幕截图未显示)。因此,该提交不是基于
A
,因此您在拉动时无法快进。您必须创建一个合并提交。

现在你提到你之前确实推动过

A
,所以这有点奇怪。如果你真的推送了它并且
D
已经发布了,那么你的推送就会失败,你必须先合并它。如果
D
尚未发布,您的推送将会通过,但是
D
的作者必须先合并它才能推送它。

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

A

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

(另一种选择是开发者推送

D
did 发生冲突,但选择强制推送,从远程存储库中删除您的提交。如果您使用 GitHub,这应该从该用户的活动中可见记录。)


0
投票

要记住的重要一点是,

git pull
是两个命令的组合,
git fetch
git merge
。另外,您的本地 master 分支与远程 master 不是同一个分支。

在您推送更改后,有人将更改推送到远程分支。所以当你从遥控器拉出时。 Git 更新了远程分支的

HEAD
,然后将其合并到本地分支中。合并会导致提交发生,因此您最终会得到合并提交。

如果您将分支重置为您最初推送的提交,然后执行

git pull --rebase
,您会发现其他开发人员添加的提交将与您的分支一致,并且您不会有合并提交。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.