使用多次撤销回滚到旧的提交

12
我希望通过使用git revert回滚到提交版本,以便保留历史记录。有没有比运行每个要回滚的提交哈希值都用git revert更简单的方法?有没有一种更快速地从特定提交版本回滚到另一个提交哈希值的方式?
在手册页面上,他们声明可以像这样做:git revert -n master~5..master~2但是当我尝试执行时出现以下错误:fatal: Cannot find 'master~5..master~2'

1
你在主分支上吗?它至少有5个提交吗? - Felix Kling
1
如果您正在查看适用于当前版本 git 的在线 man 手册副本,则可能正在使用不支持一次还原多个提交的旧版本。此功能是在 v1.7.2 中添加的。 - Cascabel
2个回答

23

git revert 命令只接受一个提交,所以该错误是在抱怨您给了它一个修订版本列表而它期望得到一个。 (更新:感谢Jefromi指出,自1.7.2版本以来,git revert实际上可以接受多个提交。) 下面我将建议三种可能的操作:

创建多个还原提交

我不确定是否可以在一条命令中完成这个动作,但如果您知道db0bc是最后一个良好的提交(即您想要还原它之后的每个提交),并且历史记录是线性的,您可以执行以下操作:

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

回到旧状态,但仍在一个分支上

如果你只关心历史记录的存在,那么你可以让下一次提交成为源代码树返回到上一个好的提交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

为旧提交创建一个新的分支

如果您是该项目中唯一的贡献者,或者您还没有推送主分支,或者您知道重置主分支不会引起问题,那么您可以采取另一种方法,在当前位置创建一个新分支,然后将主分支重置,具体操作方法在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

我认为那个 GitHub 页面上的图表非常清晰易懂。


嗯,git revert现在肯定需要多个提交参数,虽然这是一个相对较新的添加-合并到8c7da86的主线中,首次包含在v1.7.2中。 - Cascabel
@Jefromi:谢谢,我正在使用早期版本,但应该想到检查git.git... - Mark Longair
  1. git revert -<N> HEAD — 从 HEAD - <N> + 1 开始撤销 <N> 个提交,无需任何循环。
  2. git checkout -b working-branch db0bc... 将从工作提交创建一个分支,或者如果您愿意,可以使用 git checkout -b unwanted-work master
- 0andriy

10

在我看来,最自然的方法是执行以下步骤(假设你有一个干净的工作副本):

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

然后使用git commit --amend添加一些描述。(在较新版本的Git中,git-merge已经允许您指定描述。)

@{1}仅是指向重置之前分支所指向的提交。)

这将创建一个快进式的更改,因此完全记录了历史。而且,自$lastnicecommit以来引入的提交中并没有引入任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接