如何恢复多个git提交?

我有一个git存储库,以下所示: html

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

我但愿分支的头部指向A,即我但愿B,C,D和HEAD消失,我但愿头部与A同义。 git

听起来我能够尝试改变(不适用,由于我推进了之间的变化),或者还原。 可是如何恢复多个提交? 我一次还原一个吗? 订单重要吗? app


#1楼

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

考虑到你的例子,你必须这样作(假设你在分支'master'): 指针

git revert master~3..master

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

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

#2楼

git reset --hard a
git reset --mixed d
git commit

这将马上成为全部人的回复。 给出一个好的提交消息。 htm


#3楼

扩展我在评论中写的内容 ip

通常规则是您不该该重写(更改)您已发布的历史记录,由于有人可能已将其工做基于它。 若是您重写(更改)历史记录,则会在合并更改和更新时遇到问题。 get

因此解决方案是建立一个新的提交 ,它能够恢复你想要删除的更改 。 您可使用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,因此您可使用如下命令获取所需的状况:

$ 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具备相同的内容,可是是不一样的提交(提交消息,父项,提交日期)。

由Charles Bailey修改的Jeff Ferland解决方案创建在一样的想法上,但使用git reset

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

#4楼

与Jakub的答案相似,这使您能够轻松选择要还原的连续提交。

# revert all commits from B to HEAD, inclusively
$ git revert --no-commit B..HEAD  
$ git commit -m 'message'

#5楼

首先要确保您的工做副本未被修改。 而后:

git diff HEAD commit_sha_you_want_to_revert_to | git apply

而后只是提交。 不要忘记记录恢复的缘由。

相关文章
相关标签/搜索