恢复旧的合并提交文件而不影响后续提交

Posted

技术标签:

【中文标题】恢复旧的合并提交文件而不影响后续提交【英文标题】:Reverting an old merge commit files without effecting subsequent commits 【发布时间】:2020-06-28 23:24:18 【问题描述】:

我需要从主分支恢复一个非常旧的合并提交。

问题是,我不希望恢复操作影响从那时起在主分支上所做的其他更改。

据我所知,如果我使用:

git revert -m 1 [哈希合并提交]

它会恢复到合并提交的父提交,并会删除所有后来添加的更改。

合并提交涉及多个文件。

除了逐个文件之外,有没有办法通过 git 中的内置命令来实现这一点?

【问题讨论】:

【参考方案1】:

您可以交互地变基,从合并提交之前的提交开始,然后删除该合并提交的提交。

让我们从某个分支 feature/rebase-test 获取这段历史记录:

* 1ff3147 - (tag: v0.4.3, origin/master, origin/HEAD, master) Add test to show URLs with port work
* a686fbf - (tag: v0.4.2) Enable setting custom RequestHandler
* f682d20 - Add php 7.4 to Travis
* 0973364 - Make code coverage script CLI runnable
* cb106fc - Add composer.phar to gitignore
*   1d89b5e - (tag: v0.4.1) Merge pull request #62 from mvdbos/fix/event-dispatcher
|\
| * 3376b9c - Revert to the legacy EventDispatcher
|/
* f761a2c - Update README badges
*   b8447e6 - (tag: v0.4) Merge pull request #60 from mvdbos/feature/cleanup
|\
| * e278cde - Simplify build and clean up use statements
|/
*   ac6af67 - Merge pull request #59 from mvdbos/feature/update-scrutinizer

现在假设我要删除 b8447e6(因此要删除 e278cde,这是合并提交的一部分)。

我可以做到git rebase --rebase-merges --onto ac6af67 f761a2c feature/rebase-test)。 这将从f761a2c 向前移动直到feature/rebase-test 的尖端,并将其重新定位到ac6af67,这是我们想要摆脱的合并之前的提交。

在我的情况下,这导致了一些冲突,在解决之后,我的历史看起来像这样:

* d7e5919 - (HEAD -> feature/rebase-test) Add test to show URLs with port work
* 0d8e15f - Enable setting custom RequestHandler
* ce365b0 - Add php 7.4 to Travis
* 42d6f59 - Make code coverage script CLI runnable
* ad0c861 - Add composer.phar to gitignore
*   3292f4c - Merge pull request #62 from mvdbos/fix/event-dispatcher
|\
| * 3e2ceef - Revert to the legacy EventDispatcher
|/
*   ac6af67 - Merge pull request #59 from mvdbos/feature/update-scrutinizer

请注意,合并提交已消失,后续提交的结构保持不变,包括合并提交。这是由于 rebase 命令的 --rebase-merges 标志。

一个警告:您可能已经注意到,ac6af67 之后的所有提交都有一个新的哈希值(它们实际上是新的提交)。这意味着我们之前历史中存在的标签并不指向那些新的提交。它们仍然存在,所以不会被破坏。它们只是指向仍然包含您要删除的合并提交的历史记录。无法判断这是否会给您带来问题。

【讨论】:

谢谢!我不知道那个选项。最后我选择了 git revert。有一些冲突,但都解决了。

以上是关于恢复旧的合并提交文件而不影响后续提交的主要内容,如果未能解决你的问题,请参考以下文章

使用大文件恢复提交并解决二进制合并冲突

Git常见的术语有哪些?

有没有办法“软还原”旧的提交?

如何撤消对特定文件的已提交更改而不进行变基?

GIT 工作流程:将大部分功能分支合并到 master 中,省略一个特定的提交?

Safari blob 下载影响表单提交 - 导致表单帖子被下载而不是在新选项卡中打开