你如何恢复错误的git合并提交

时间:2010-11-03 03:32:15

标签: git version-control merge

所以我的一个同事意外地进行了合并,实际上只保留了树的一面。所以他开始合并,删除了合并引入的所有更改,然后提交了合并。

这是我在测试回购中做的一个简单的测试用例。这个回购有三个分支。 idx是意外合并的主题分支,master是主线。 dev只是对revert -m如何工作的测试,所以你可以忽略它。

alt text

我想要做的是恢复错误的合并。所以我从主人那里尝试运行git revert -m 1 <sha1sum of faulty merge>,但随后git以:

响应
# On branch master                               
nothing to commit (working directory clean)

因此它实际上并不创建撤消合并的恢复提交。我相信这是因为合并实际上并没有包含任何真正的变化。

如果您想玩我的测试报告,可以从here

下载

这是一个git bug,还是我错过了什么?

2 个答案:

答案 0 :(得分:7)

最好的经验法则是永远不会改变你的回购公开之后的历史。这真的搞砸了。我不认为这种情况可以避免它。

我认为这里有几个选项,但最简单的是做一个rebase。使用您的仓库,这些是我使用的命令:

git rebase -i ead3646

然后,当交互式shell出现时,删除错误提交的整行。除此之外,你应该结束这样的新历史

* f0ab6d5 more normal work on dev
* ebb5103 idx commit
* ead3646 master change
* 582c38c dev commits
* f4b8bc6 initial commit

让你们两个(和其他人)重新同步,这将需要一些分支,推送,电子邮件和午餐购买。

答案 1 :(得分:6)

git文档说明了关于还原合并:git/Documentation/howto/revert-a-faulty-merge.txt 虽然这主要是关于恢复导致错误更改的合并,而不是还原不正确的合并。

基本上,恢复合并将撤消数据更改,但不会撤消历史(图形)更改。因此,预计恢复错误的合并无效。

您可以处理此问题的一种方法是再次进行合并,然后将其结果合并到master中。在您的示例中,这可能是:

git checkout -b temp/merge-fixup ead364653b601f48159bca5cb59d6a204a426168
git merge 2fce9bfe8f721c45ea1ed5f93176322cac60a1d9
git checkout master
git merge temp/merge-fixup
git branch -d temp/merge-fixup