好的,我对git非常熟悉,包括git revert和git reset。我认为我想做的事情无法完成,只是想仔细检查。
我们假设我有一个回购,其中一位同事已经做了数十次糟糕的合并提交。我想将repo重置回上次已知的良好提交。我不想使用重置并且必须进行强制推送,因为这会弄乱我所有其他同事的本地副本。我也不认为revert可以很容易地用来撤消几十个合并提交。
我最好的想法是克隆repo的第二个副本,签出正确的提交,然后转到我原来的本地副本,创建分支,删除每个文件,并从第二个repo复制所有内容。然后正常提交,推送,合并。我能改进吗?
答案 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;分支运动的方向,因此不需要强制推动,也不需要清理其他回收。