【问题标题】:How to revert a commit that was merged with a lot of other commits, without losing the commits in between (Azure Devops)如何还原与许多其他提交合并的提交,而不会丢失其间的提交(Azure Devops)
【发布时间】:2021-12-09 05:23:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 听起来像是git revert 的典型工作。看看doc。不过,您不必恢复提交合并。根据您的工作流程,仅还原“错误”提交本身(或仅还原合并提交,但通常比较棘手,请注意)就足够了。
  • 感谢@RomainValeri 的回答。但是,提交(从 9 月 3 日开始)的还原不会也还原之后发生的任何事情吗?
  • 不,它不会不会。这正是git cherry-pickgit revert 的重点(实际上只是一个“消极”的樱桃挑选):提取一些提交增量(通过与其父项的差异)以将这些更改移植到其他地方,而没有附加任何其他历史记录.

标签: git visual-studio azure-devops git-commit git-revert


【解决方案1】:

作为 cmets 中的 @RomainValeri pointed outgit revert 命令就是您在此处寻找的。​​p>

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

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

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

您提到您只想从包含M 的分支中还原A 引入的更改。您可以通过使用以下命令还原合并提交 M 来做到这一点:

git revert -m 1 M

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

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

这将在新提交W 中应用M(在本例中为X)和A 的第一个父级之间的差异的反向:

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

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

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

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

【讨论】:

  • 很好地解释了用于恢复合并的-m 选项。
猜你喜欢
  • 2013-07-31
  • 2021-04-14
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2015-12-25
相关资源
最近更新 更多