在不影响后续提交的情况下还原旧的合并提交文件

问题描述 投票:2回答:1

我需要从主分支还原非常老的合并提交。

事实是,我不希望还原操作影响从主分支上的该点所做的其他更改。

据我了解,如果我使用:

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

它将还原为合并提交的父提交,并删除以后添加的所有更改。

合并提交涉及多个文件。

除了通过逐个文件操作外,是否可以通过git中的内置命令来实现此目的?

git git-merge git-revert
1个回答
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之后的所有提交都有新的哈希(它们实际上是新的提交)。这意味着我们以前的历史中存在的标记不会指向这些新的提交。虽然它们确实仍然存在,所以没有任何问题。它们只是指向一个仍包含您要删除的合并提交的历史记录。无法判断这是否会对您造成问题。
© www.soinside.com 2019 - 2024. All rights reserved.