如何还原与许多其他提交合并的提交,而不会丢失其间的提交 (Azure Devops)

How to revert a commit that was merged with a lot of other commits, without losing the commits in between (Azure Devops)

我对 GIT 的体验低至 none,所以我问的可能听起来有点奇怪。我们有一个 Azure Devops 存储库,每天都有提交。

9 月 3 日,我们的 Azure Devops 存储库中发生了一些更改的提交。这是承诺的,但从未推动过。此后开发人员缺席,在过去的 2 个月中发生了很多提交。然后,在 10 月 21 日,9 月 3 日的提交与其间的所有提交合并并最终推送。

有没有办法恢复合并的提交(发生在 10 月 21 日)和提交本身(发生在 9 月 3 日)而不丢失其间的所有提交?

这发生在 Azure Devops 中,提交和推送主要在 Visual Studio 2019 年进行。

因为 in the comments, the git revert 命令就是您要查找的内容。

首先,让我们想象一下情况:

o---o---o---o---o---X---M
     \                 /
      A----------------

此处,提交 A 是 9 月 3 日的提交,M 是 10 月 21 日的合并提交。

您提到您只想从包含 M 的分支中还原 A 引入的更改。您可以通过以下方式还原合并提交 M 来实现:

git revert -m 1 M

其中 M 是指向合并提交的引用。

现在,由于合并提交有 2 个或更多 parents,您还需要告诉 Git 它应该使用 parents 中的哪个作为基准来确定什么它应该恢复的更改。这就是 -m (--mainline) 选项的用途。在这种情况下,我们希望目标分支(即 A 被合并 的分支)作为基线,所以我们说 -m 1, a.k.a 第一个parent.

这将在新提交 W:

o---o---o---o---o---X---M---W
     \                 /
      A----------------

通常将合并提交的反向称为 W,因为它看起来像颠倒的 M

请记住,还原合并提交会撤消更改,但不会撤消历史记录。换句话说,即使在 W 之后,Git 仍会将与 M 合并的分支视为 merged。如果您尝试再次合并它,Git 会告诉您 一切都是 up-to-date.

因此,如果您以后想再次合并同一个分支,则必须先还原还原。请查看此 how-to from Git's documentation 以了解有关如何执行此操作的详细信息。