如何撤销合并提交(Git)?

11

我的同事在编辑代码库时,她没有拉取最新的更改,因此软件不允许她提交她的更改。

我们进入终端并拉取了她忽略的提交,然后她就能推送了,唯一的问题是它将那些更改合并到了她分支中,并将这些提交归属于了她。

它看起来像这样:

A-B-C-D-E(假设D和E是别人提交的)

我的同事有:

A-B-C,并想添加一些东西。

所以她拉取了D和E并推送了这些更改,现在看起来像这样:

A-B-C-D-E-F,只不过更改D、E和F现在都来自她的账户。

有没有一种方法可以保留她的更改(F),但让时间轴回到D和E被归属于别人的时候呢?

谢谢!

问题的图形表示:

A-B-C-D-E(主版本最新版)

A-B-C(同事拥有这个版本)

A-B-C-F(同事进行编辑)(分支已经分叉)

!错误!(同事尝试提交和推送)

A-B-C-D-E-F(同事将主版本合并到她的分支中)

A-B-C-D-E-F(同事推送了)

Github UI现在不显示更改D-E,它们被合并到了“合并分支'master'…”中。


将这些提交归因于她 - 在任何正常情况下都不应该发生。您能提供有关重现步骤的详细信息吗? - Oliver Charlesworth
是的,所以,该分支(master)最初有三个最近的提交,它们分别在7月6日、7月7日和7月8日。我的同事只拉取了截至7月5日的更改。然而,她似乎是基于她手头上的内容开始编辑的,因此shell告诉她她的分支已经与master分支分叉。所以她将master分支的提交合并到了她的分支中,然后推送了。结果看起来好像7月6日、7日和8日的提交现在是她的。在GitHub网站上,我可以看到整个历史记录,但在软件中,第6、7和8次提交已经消失了。 - James Yen
2个回答

9

使用 git log 查看合并前的提交版本号(sha),记下来。

然后可以使用以下命令重置: git reset --hard commit_sha

如果你想要移除 D 和 E ,可以执行以下步骤,但是它也会一起移除 F。也就是说,最后三个提交都会被移除。 git reset --hard HEAD~3


1
如果您将此推送到远程,会发生什么? - grenix

0

如果您使用了git merge $main_branch,GitHub的UI可能会显示一些元数据,使其看起来像是您暂时实现了更改,但当您最终将所有内容合并到主分支中时,一切都会没问题。如果您仍然担心,这里最好的选择是简单地:

  1. 从主/当前分支(即D、E提交的“其他团队成员”所在的位置)检出一个新分支

  2. 对于您的所有3个提交,git cherry-pick $your_commits。现在的顺序将是:D-E-A-B-C,如果F也在主分支上,则为D-E-F-A-B-C。


我的同事从未使用过 git-merge 命令,她所做的是将 D、E 提交拉取到本地并进行 git-push。因此,在 GitHub UI 中,D、E 提交已经从历史记录中消失,并被合并到了她的提交中。但是,GitHub 网站仍然显示之前的提交记录。 - James Yen
1
@JamesYen,git pullgit fetch 后跟着 git merge FETCH_HEAD 的简写。 - steveax
@JamesYen 为了最小化混淆,你最好从干净的分支开始,其中包含 D 到 F 的提交记录,然后再挑选 A 到 C。听起来由于提交顺序可能会有一些奇怪的情况。另一个选择是手动git fetch 然后 git-rebase,使所有之前(其他人的)提交记录先添加,然后是你的提交记录。 - Torrey Payne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接