使用revert多次回滚到旧提交

时间:2011-01-17 17:35:58

标签: git

我想使用git revert回滚到提交,这样我就可以保留历史记录。有没有更简单的方法来执行此操作然后为我想要还原的每个提交哈希运行git revert?有没有更快的方法从特定提交一直恢复到另一个提交哈希?

在手册页上,他们声明您可以执行类似git revert -n master~5..master~2之类的操作,但当我尝试这样做时,我会收到此错误:fatal: Cannot find 'master~5..master~2'

2 个答案:

答案 0 :(得分:21)

git revert应该只进行一次提交,因此错误就是抱怨你正在给它一个预期的修订列表。 (更新:感谢Jefromi指出自1.7.2以来,git revert实际上可以进行多次提交。)我将在下面提出三种可能的行动方案:< / p>

创建多个还原提交

我不确定你是否可以在一个命令中执行此操作,但是如果你知道db0bc是最后一个好的提交(即你想在之后恢复每个提交)并且历史是线性的,那么你可以这样做:

for s in $(git rev-list --reverse db0bc..)
do
    git revert --no-edit $s
done

直接回到旧州,但仍然在一个分支

另一方面,如果你只关心那里的历史,你总是可以让下一次提交成为源树的状态,回到最后一次良好提交db0bc而不引入恢复提交 - 你' ll仍然具有在当时和你的新提交之间引入的历史记录,但是之间没有大量的恢复提交。如果历史是非线性的,这也不会有问题:

# Check that "git status" is clean:
git status

# Set the index (staging area) to be as it was at commit db0bc:
git read-tree db0bc

# Create a commit based on that index:
git commit -m "Going back to the state at commit db0bc"

# Your working tree will still be as it was when you started, so
# you'll want to reset that to the new commit:
git reset --hard

为旧提交

创建一个新分支

如果你是唯一一个从事这个项目的人,或者你还没有推动大师,或者你知道重置你的主分支不会导致问题,你可以采取另一种方法,并创建一个新的分支在你当前的位置然后重置主人,正如在github's "undoing" page上所描述的那样。总之,你可以这样做:

# Make sure you're on master:
git checkout master

# Check that "git status" is clean, since later you'll be using "git reset --hard":
git status

# Create a new branch based on your current HEAD:
git branch unwanted-work

# Reset master back to the last good commit:
git reset --hard db0bc

我认为,github页面上的图表使这个很清晰。

答案 1 :(得分:9)

恕我直言,最自然的方法是做(假设你有一份干净的工作副本):

git reset --hard $lastnicecommit; git merge -s ours @{1}

然后git commit --amend添加一些说明。 (在较新版本的git git-merge上已经允许您指定说明。)

@{1}只是指你的分支在重置之前指向的提交。)

这样可以快速进行更改,因此可以完整地记录历史记录。自$lastnicecommit以来提交的更改仍未引入任何更改。