许多错误合并后,将git恢复为特定的提交

时间:2018-01-04 20:09:59

标签: git

好的,我对git非常熟悉,包括git revert和git reset。我认为我想做的事情无法完成,只是想仔细检查。

我们假设我有一个回购,其中一位同事已经做了数十次糟糕的合并提交。我想将repo重置回上次已知的良好提交。我不想使用重置并且必须进行强制推送,因为这会弄乱我所有其他同事的本地副本。我也不认为revert可以很容易地用来撤消几十个合并提交。

我最好的想法是克隆repo的第二个副本,签出正确的提交,然后转到我原来的本地副本,创建分支,删除每个文件,并从第二个repo复制所有内容。然后正常提交,推送,合并。我能改进吗?

3 个答案:

答案 0 :(得分:1)

是的,您可以将所有这些组合到一个git repo上的操作中。

git checkout <branch in question>
rm -Rf * # This will leave the .git directory and any other hidden files in the root that you may need to manually further deal with
git checkout <good sha> -- .
git add .
# commit, test, etc. as required

答案 1 :(得分:0)

试试这个,提交哈希<commit>

git revert --no-commit <commit>..HEAD
git commit -m "Reverted a bunch of bad merges"

答案 2 :(得分:0)

如果你不介意运行管道命令,那么有一个单行选项。使用master(或任何分支将接收新的&#34;还原&#34;提交)签出:

 git reset --hard `git commit-tree -p HEAD -m "revert to last good state" <good-commit>^{tree}`

其中<good-commit>是您所需状态的提交的ID(或其他有效名称 - 可能是标记,或类似HEAD~15的表达式)。

这确实使用了reset,但它是以尊重&#34; normal&#34;分支运动的方向,因此不需要强制推动,也不需要清理其他回收。