恢复旧的合并提交文件而不影响后续提交
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。有一些冲突,但都解决了。以上是关于恢复旧的合并提交文件而不影响后续提交的主要内容,如果未能解决你的问题,请参考以下文章