还原多个git提交

我有一个如下所示的git存储库:

A -> B -> C -> D -> HEAD

我希望分支的头部指向A,即我希望B,C,D和HEAD消失,并且我希望头部与A同义。

这听起来像我可以尝试重设(不适用,因为我推动了变化),或恢复。 但是,我如何恢复多个提交? 我是否一次回复一个? 订单重要吗?


扩大我在评论中写的内容

一般的规则是,你不应该改写(改变)你已经发布的历史,因为有人可能已经基于他们的工作。 如果您重写(更改)历史记录,则会在合并其更改和更新它们时遇到问题。

因此,解决方案是创建一个新的提交, 恢复您想要删除的更改 。 你可以使用git revert命令来做到这一点。

你有以下情况:

A <-- B  <-- C <-- D                                               <-- master <-- HEAD

(这里的箭头指向指针的方向:在提交的情况下为“父”引用,在分支头(分支引用)的情况下为顶部提交,在HEAD引用的情况下为分支的名称)。

你需要创建以下内容:

A <-- B  <-- C <-- D <-- [(BCD)^-1]                   <-- master <-- HEAD

其中“[(BCD)^ - 1]”表示提交恢复提交B,C,D中的更改。数学告诉我们(BCD)^ - 1 = D ^ -1 C ^ -1 B ^ -1,so您可以使用以下命令获取所需的情况:

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"

可选的解决方案是签出提交A的内容,并提交这个状态:

$ git checkout -f A -- .
$ git commit -a

那么你会有以下情况:

A <-- B  <-- C <-- D <-- A'                       <-- master <-- HEAD

提交A'具有与提交A相同的内容,但是是不同的提交(提交消息,父母,提交日期)。

杰夫·费兰的解决方案,由查尔斯·贝利修改建立在相同的想法,但使用git reset:

$ git reset --hard A
$ git reset --soft @{1}  # (or ORIG_HEAD), which is D
$ git commit

为此,您只需使用revert命令,指定要恢复的提交范围。

考虑到你的例子,你必须这样做(假设你在分支'主'):

git revert master~3..master

这将在你的本地创建一个新的提交,并提交B,C和D的反向提交(意味着它将撤消这些提交引入的更改):

A <- B <- C <- D <- BCD' <- HEAD

与Jakub的回答类似,这可以让您轻松选择连续的提交来恢复。

# revert all commits from B to HEAD, inclusively
$ git revert --no-commit B..HEAD  
$ git commit -m 'message'
链接地址: http://www.djcxy.com/p/18915.html

上一篇: Revert multiple git commits

下一篇: How to revert Git repository to a previous commit?