Git - 如何还原已推送到远程分支(不是原点)的rebase

时间:2012-11-22 13:52:40

标签: git git-rebase

我正在我的本地分支上做一些改变,当我完成后,我把所有东西推到远程brach。在将分支与开发合并之前,我认为我应该做一个反思,因为其他人已经在那里合并了很多代码。当我做了rebase并解决了一些冲突时,我推到了远程分支。不幸的是,我解决冲突的方式是错误的,所以现在我需要在rebase发生之前返回并将远程分支更新到新状态。

我尝试了什么

  1. 重置头

    git reset --hard HEAD @ {x} //其中x是在rebase之前的头

  2. 这可以恢复我本地分支上的更改,但后来我不知道如何使远程分支更新,因为它不会创建可以推送到远程的新提交。

1 个答案:

答案 0 :(得分:5)

您不应该重写远程存储库的历史记录,因为如果

  1. 你推破了什么
  2. 有人拉
  3. 你强行推动不同的历史
  4. 你不仅会遇到必须解决问题的问题,而且还有其他推动变革的人。所以,除非你能确定没有人拉它,否则不要强行推送

    相反,你应该使用

    恢复提交
    >> git revert HEAD@{y}   # where HEAD@{y} is the faulty commit
    

    如果合并的话,只有一次提交很麻烦。

    如果rebase将几个提交转换到主分支上,则需要执行

    >> git revert --no-commit HEAD
    >> git revert --no-commit HEAD~1
    >> git revert --no-commit HEAD~2
       ...
    >> git revert --no-commit HEAD@{x}
    >> git commit -m "Sorry folks for the big mess I made"
    

    所有HEAD~y都是HEAD@{x}HEAD之间的提交。

    这将在一次大型提交中有效撤消所有受影响的提交。