我已经提交了一个包含消息" m1"的文件。后来,我修改了它,并且我试图修改最后一次提交。但是,我已经更改了最后一条消息,并通过消息" m2"提交了更改。
情况是我提交了两个不同的提交,其中一个正在等待推送,另一个正在等待提取。我绝对不了解这种情况,我也无法弄清楚是什么。
有什么想法吗?
答案 0 :(得分:4)
问题是git commit --amend
没有 - 而且无法 - 更改提交。
相反,它创建了一个新的提交,除了你修改过的任何东西之外,它的味道很像旧的提交。然后它使当前分支名称指向新提交而不是旧提交。
如果其他人已经有旧提交,他们仍然拥有。在这种情况下,您已经发送了上游提交(使用git push
),或者首先从您的上游获取它(使用git fetch
后跟一些东西,通常是合并或变基,设置您的本地分支包含提交)。所以他们仍然有原版,现在你有副本:
C' <-- branch
/
... <- A <- B
\
C <-- upstream/branch
您还有C
指向的原始版本upstream/branch
(在此图表中)和您的reflog(您通常不会看到它)。你和你只有你的“修改”副本C'
,至少在你以某种方式发表它之前。
如果你使用git push --force
,你可以 1 说服你的上游接受它,丢弃原始C
的副本。这样做会让每个其他的人感到恼火,他们也拥有原始C
的副本并可能正在使用它,所以请确保即使你得到许可,你可以得到宽恕。 :-)如果没有其他人(除了上游)有C
,或者如果每个人都同意接受这种替换,你就可以了。
1 上游是否接受强制推动是否达到上游。
答案 1 :(得分:1)
通过修改提交,您更改了存储库的历史记录。 Git试图通过声称您的分支已经与您的远程分支分道来纠正这一点,并允许您合并以修复它。
不合并。如果您修改了提交,则打算重写历史记录。
相反,你可以强制推动分支:
git push --force
这将告诉Git您完全打算覆盖历史记录,并且您的本地分支具有正确的历史记录,以反映在您的远程存储库中。
答案 2 :(得分:0)