使用revert多次回滚到旧提交

Dav*_*vid 11 git

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

在手册页上,他们声明你可以做这样的事情,git revert -n master~5..master~2但是当我尝试这样做时,我得到了这个错误:fatal: Cannot find 'master~5..master~2'

Mar*_*air 21

git revert应该采取一次提交,以便错误抱怨您正在给它一个预期的修订列表. (更新:感谢Jefromi指出,自1.7.2以来,git revert实际上可以进行多次提交.)我将在下面提出三种可能的行动方案:

创建多个还原提交

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

for s in $(git rev-list --reverse db0bc..)
do
    git revert --no-edit $s
done
Run Code Online (Sandbox Code Playgroud)

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

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

# 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
Run Code Online (Sandbox Code Playgroud)

为旧提交创建一个新分支

如果您是唯一从事该项目的人,或者您还没有推动过硕士,或者您知道重置您的主分支不会导致问题,您可以采取另一种方法,并在当前创建一个新的分支在github的"撤消"页面上很好地描述了位置,然后重置了主控器.总之,你可以这样做:

# 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
Run Code Online (Sandbox Code Playgroud)

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


Uwe*_*nig 9

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

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

然后git commit --amend添加一些描述.(在较新版本的git上git-merge已经允许你指定一个描述.)

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

这使得快速变化,因此完全记录了历史.自那以后提交的更改仍然$lastnicecommit没有引入任何更改.