git:git revert的更好方法,无需额外的恢复提交

时间:2009-10-06 16:29:57

标签: git revert

我在远程+本地分支中提交了一个提交,我希望将该提交从历史记录中删除,并将其中一些提交到自己的分支中。

基本上,我现在有:

           D---E---F---G master

我想要:

             E---G topic
            /
           D master

这应该是我的本地和(只有一个,称为原点)远程存储库。

哪种方法最干净?

此外,还有其他人克隆了该回购并且已经检查了主分支。如果我在远程仓库中进行这样的改变,那么'git pull'会让他们也能够进入同一个状态吗?

3 个答案:

答案 0 :(得分:7)

如果您已发布,则表示您不想重写master的历史记录。你想要的是发布一个提交给master,它将它恢复到D所处的状态,同时保留其当前历史记录,以便其他用户可以轻松地合并或改变他们的工作。

如果您计划在将来某个时候将topic合并到master,那么您可能还想做的是在master和{{1}之间建立一个新的共同基础因此,当您随后合并topic时,您不会丢失在topic中恢复的提交。最简单的方法是在“撤销”提交之上进行“重做”提交,将master重置为原始状态,并将新的master分支置于其上。< / p>

topic

作为替代方案,你可以让提交E',F'和G'分别重做每个部分但是因为E,F和G已经在你发布的历史中,如果你只是引用'undo'提交,那么它可能更容易理解。说这项承诺正在撤消。无论如何,这就是# checkout master branch (currently at G) git checkout master # Reset the index to how we want master to look like git reset D # Move the branch pointer back to where it should be, leaving the index # looking like D git reset --soft HEAD@{1} # Make a commit (D') for the head of the master branch git commit -m "Temporarily revert E, F and G" # Create the new topic branch based on master. # We're going to make it on top of master and the 'undo' # commit to ensure that subsequent merges of master->topic # or topic->master don't merge in the undo. git checkout -b topic # Revert the undo commit, making a redo commit (G'). git revert HEAD 的作用。

基本上你知道的就是这个。

git revert

重要的是你没有重写历史记录,主题是基于master的,所以合并不会意外地应用任何“撤销”提交。您现在可以安全地将D -- E -- F -- G -- D' <-- master \ \ G' <-- topic master同时推送到远程存储库。

答案 1 :(得分:4)

如果您愿意,可以重写您的历史记录,但如果其他人拥有历史记录副本,那么这是一个坏主意。在这种情况下,您可能会使用交互式rebase:git rebase -i master topic。这将为您提供从主人到主题的提交列表,以及有关如何使用它们的提示。您只需要删除包含要删除的提交的行。

那就是说,我必须强调,如果其他人有这段历史,这样做是不负责任的。您必须强制将其推送到您的中央仓库,其他所有人都必须修复其存储库以匹配,根据具体情况可能相对简单或复杂。

如果您真的愿意,可以在git-rebase man page中讨论如何处理这个问题的“从上游rebase恢复”这个很好的部分。

编辑:

对于简单的历史记录,一个常见的情况是,在强制非快速推送到中央仓库(push -f)后,其他开发人员:

  • 备份他们的老主人:git branch -m master master_old
  • 获取更新并从原点重新创建master:git remote update origin; git branch master origin/master
  • 将所有主题分支重新绑定到新主分支:git rebase --onto master master_old topic

如果他们已经在他们的主分支中工作了,那么他们将不得不变得更加漂亮,将这项工作和所有主题分支到主人的新职位......这个应该让你知道为什么重写其他人的历史是如此可怕。实际上,一旦某些内容传递到公共存储库,您应该将其视为难以记录的历史记录,而不是正在进行的工作。

答案 2 :(得分:-3)

我发现git stash非常有用

将它藏起来,再也不要再看它了。