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

Jas*_*son 16 git version-control merge

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

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

替代文字

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

# On branch master                               
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

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

如果你想玩我的测试报告,你可以从这里下载它

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

bry*_*mcd 8

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

我认为这里有几个选项,但最简单的是做一个rebase.使用你的repo,这些是我使用的命令:

git rebase -i ead3646
Run Code Online (Sandbox Code Playgroud)

然后,当交互式shell出现时,删除错误提交的整行.保存,你应该结束这样的新历史:

* f0ab6d5 more normal work on dev
* ebb5103 idx commit
* ead3646 master change
* 582c38c dev commits
* f4b8bc6 initial commit
Run Code Online (Sandbox Code Playgroud)

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

  • 我没有机会仔细阅读有关合并提交的`git revert`文档,但`-m`选项专门允许它在合并提交上运行.显然,应该有一种方法可以做到这一点,问题就是它在这种情况下不起作用的原因. (2认同)

jil*_*les 8

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
Run Code Online (Sandbox Code Playgroud)

  • 现在文档似乎消失了. (2认同)