如何还原与许多其他提交合并的提交,而不会丢失其间的提交 (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 以了解有关如何执行此操作的详细信息。
我对 GIT 的体验低至 none,所以我问的可能听起来有点奇怪。我们有一个 Azure Devops 存储库,每天都有提交。
9 月 3 日,我们的 Azure Devops 存储库中发生了一些更改的提交。这是承诺的,但从未推动过。此后开发人员缺席,在过去的 2 个月中发生了很多提交。然后,在 10 月 21 日,9 月 3 日的提交与其间的所有提交合并并最终推送。
有没有办法恢复合并的提交(发生在 10 月 21 日)和提交本身(发生在 9 月 3 日)而不丢失其间的所有提交?
这发生在 Azure Devops 中,提交和推送主要在 Visual Studio 2019 年进行。
因为 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 以了解有关如何执行此操作的详细信息。