SyMind / learning

路漫漫其修远兮,吾将上下而求索。
10 stars 1 forks source link

如何 revert 多个 git commit? #16

Open SyMind opened 3 years ago

SyMind commented 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 命令

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 是一样的。

使用 git checkout 命令

该方法添加的文件不会被删除。

git checkout -f A -- . # checkout that revision over the top of local files
git commit -a

使用 git reset 命令

git reset --hard A
git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D
git commit