Open SyMind opened 3 years ago
原文:https://stackoverflow.com/questions/1463340/how-to-revert-multiple-git-commits
拥有一个 git 仓库如下:
A <- B <- C <- D <- HEAD
想要分支的 HEAD 指向 A,也就是说想要移除 B、C、D 和 HEAD 。
看起来可以使用 revert,但如何 revert 多个 commit? 还是一次只能 revert 一个? 顺序是否重要?
一般的规则是,不应该重写已经发布的历史,因为可能已经有人基于它来进行了他们的工作。如果重写历史,将在合并他们的更改时产生问题。
所以解决方案是创建一个新的 commit 来移除。
git revert --no-commit D git revert --no-commit C git revert --no-commit B git commit -m "the commit message for all of them"
或
git revert --no-commit B..HEAD git commit -m 'message'
git revert --no-commit HEAD~3..
.. 用于创建范围,HEAD~3.. 和 HEAD~3..HEAD 是一样的。
..
HEAD~3..
HEAD~3..HEAD
该方法添加的文件不会被删除。
git checkout -f A -- . # checkout that revision over the top of local files git commit -a
git reset --hard A git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D git commit
问题
拥有一个 git 仓库如下:
想要分支的 HEAD 指向 A,也就是说想要移除 B、C、D 和 HEAD 。
看起来可以使用 revert,但如何 revert 多个 commit? 还是一次只能 revert 一个? 顺序是否重要?
解决方案
一般的规则是,不应该重写已经发布的历史,因为可能已经有人基于它来进行了他们的工作。如果重写历史,将在合并他们的更改时产生问题。
所以解决方案是创建一个新的 commit 来移除。
使用 git revert 命令
或
或
..
用于创建范围,HEAD~3..
和HEAD~3..HEAD
是一样的。使用 git checkout 命令
该方法添加的文件不会被删除。
使用 git reset 命令