git merge some-other-branch
,但从未将更改推送到原始master。我不是故意要合并的,所以我想撤消它。合并后执行git status
时,收到以下消息:# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
根据我发现的一些说明,我尝试运行
git revert HEAD -m 1
但是现在我收到的消息是
git status
:# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
我不希望我的分支领先于任何数量提交。我该如何回到这一点?
#1 楼
使用git reflog
可以检查哪个提交是合并之前的提交(git reflog
比git log
更好的选择)。然后您可以使用以下方法重置它:git reset --hard commit_sha
还有另一种方法:
git reset --hard HEAD~1
返回1个commit。
请注意,任何已修改和未提交/未隐藏的文件都将重置为其未修改状态。要保留它们,可以隐藏存储,或参阅下面的
--merge
选项。 正如@Velmont在下面的回答中建议的那样,在这种直接情况下,使用:
git reset --hard ORIG_HEAD
可能会产生更好的结果,因为它应该保留您的更改。
ORIG_HEAD
将在合并发生之前直接指向一个提交,因此您不必自己寻找它。另一个提示是使用
--merge
开关而不是--hard
,因为不会不必要地重置文件:git reset --merge ORIG_HEAD
--merge
重置索引并更新工作树中的文件
评论
我认为这不会(永远吗?)-“合并前一个”将是从另一个分支中合并的最新提交-不会是当前分支上的最新提交。对? (这可能只是git log选择默认显示的结果-也许有git log的不同输出或git reflog可用于此)
– John Bachir
2011年1月14日18:12
我认为这可能取决于您是否合并壁球。
– Marcin Gil
2011年1月15日12:45
@JohnBachir是正确的。在git日志输出中,您想查看两个父提交。一种是分支中的最新提交,一种是合并到分支中的最新提交。您想git reset --hard合并到分支中的父提交。
–贾斯汀
2011年10月12日20:21
@JohnBachir:只要“合并”不是真正的快进,它就会导致一个新的提交位于日志的顶部,并且该提交有两个父级(如果您是章鱼,则两个以上)合并)。如果删除此一个合并提交,那么从合并中传入的所有较旧的提交也将消失。为了安全起见,重置后git会告诉您新的头在哪里:“ HEAD现在位于88a04de
– Mark E. Haase
2011年11月21日在16:36
我发现有用的是查看“ git reflog”并查找我在master中所做的最后一次提交。然后做git reset --hard
–马克斯·威廉姆斯(Max Williams)
2012年12月5日在16:53
#2 楼
假设您的本地主服务器不在源/主服务器之前,那么您应该可以做到git reset --hard origin/master
,那么本地
master
分支应该看起来与origin/master
相同。评论
@Carter实际上不是最佳答案。在某些合并之前,起源/母版可能比合并之前更早于本地母版,在这种情况下,这可能无法提供所需的结果
–德鲁瓦·萨加尔(Dhruva Sagar)
2011年6月22日14:55
@ dhruva-sagar是的,但是只要git不会说您落后于您,并且您不进行抓取,就可以了。
–开尔文
2011-12-15 17:10
谢谢!当(且仅当)拥有远程存储库时,这才是完美的。
–tomc
13年1月31日上午10:59
不,它不是此问题的理想选择,请参阅“假定”子句。 MBO的答案实际上涵盖了这种情况,以及合并不是唯一本地提交的情况。
–歌手
2013年3月21日14:29
再一次,也许这个警告应该进入答案本身:始终避免重写git历史!
– Cregox
2013年9月17日20:18在
#3 楼
请参阅Git书中的第4章和Linus Torvalds的原始帖子。要撤消已经推送的合并,请执行以下操作:
git revert -m 1 commit_hash
如果您再次提交分支,请确保还原还原,如Linus所说。
评论
@perfectionist同意:)有点希望有一种方法可以将这个答案转移到另一个问题上-(也许有吗?)
– mikermcneil
13年4月16日在23:04
有关还原的更多信息:链接
– assaqqaf
2014年4月4日在2:22
为了确定此还原已成功,您可以执行git diff hash1 hash2 hash2,其中hash1是已提交的还原,而hash2是您试图返回其状态的旧提交。没有输出==成功!通过执行多次此操作,我能够回退多个提交,首先还原最近的合并并向后工作。 git diff向我展示了我最终处于想要的状态。
–罗伯特·辛顿
2014年5月6日9:41
请注意,这实际上并不能解决原始张贴者的问题。原始海报已使用git revert -m 1
–user456814
2014年7月5日在18:12
这是来自Github的大量资源:如何使用Git撤消(几乎)任何操作
– Jasonleonhard
17年2月3日在21:16
#4 楼
奇怪的是,最简单的命令丢失了。大多数答案都有效,但是撤消您刚才所做的合并,这是一种简单且安全的方法:git reset --merge ORIG_HEAD
引用
ORIG_HEAD
将指向合并之前的原始提交。(
--merge
选项与合并无关。就像git reset --hard ORIG_HEAD
一样,但更安全,因为它不会涉及未提交的更改。)评论
如果您之后已经弄脏了工作树,则git reset --merge ORIG_HEAD将保留这些更改。
– ying
13年4月11日在11:59
这是唯一正确的答案(我并不是说这是最佳答案-请注意区别)。假设,在master上,我在t1,t3和t5进行了3次提交。假设,在branch1上,我在t2,t4和t6做了3条评论(假设t1,t2,t3,t4,t5和t6按时间顺序排列)。任何类似于git reset --hard HEAD〜5的命令都只会重置HEAD(可以删除master和branch1中的提交)。仅--merge选项可删除合并。
– Manu Manjunath
16年2月17日在7:51
@Manu --merge选项实际上并未删除合并,您可以使用--hard也会很好地工作。这里是参考ORIG_HEAD,它是在您合并到该位置之前设置的。 :)
–odinho-费尔蒙特
16-2-25在10:26
@yingted你的意思是“如果从那以后弄脏了工作树,则git reset --merge ORIG_HEAD将保留这些更改。”您的意思是合并后更改文件吗?无论如何,我做了合并,然后做了一些解决冲突的事情。但是后来我想重置合并,并按照此答案的指示进行操作。一切都很好,并没有保留合并后所做的更改。我的本地仓库与合并之前的职位相似。
–萨米莎(Samitha Chathuranga)
16年6月9日在7:23
git reset --hard ORIG_HEAD命令对我来说非常有效-可能是因为我尝试撤消本地git合并后没有对存储库进行任何其他更改。该命令仅将存储库的状态重置为合并之前的状态。多谢小费!
– bluebinary
17年1月27日在1:00
#5 楼
对于较新的Git版本,如果您尚未提交合并并且遇到合并冲突,则只需执行以下操作:git merge --abort
来自
man git merge
:[此]仅在合并导致冲突后才能运行。
git merge --abort
将中止合并过程,并尝试重建合并前状态。评论
他的合并已提交但尚未推送(请参见标题),他已经合并,仅当他仍在合并过程中时命令才起作用
– JBoy
19 Mar 27 '19在9:42
#6 楼
您应该重置为上一次提交。这应该起作用:git reset --hard HEAD^
甚至
HEAD^^
都可以还原该还原提交。如果您不确定应该返回多少步骤,可以始终提供完整的SHA参考。如果遇到问题并且master分支没有任何本地更改,则可以重置为
origin/master
。评论
最好的答案恕我直言,它结合了OP自己的一个(假设只有1个步骤可以还原,这在Q中就是这种情况),以及randomguy3的快捷方式(当“您的主分支没有任何本地更改时起作用”) ”)
–歌手
2013年3月21日14:31
您的评论者@Inger和@Konstantin,为什么?创建我的答案后,您来过这里,这更正确。仅将HEAD抬高一个步骤通常是错误的,并且您必须实际计算出需要走多远。 Git已经为您设置了ORIG_HEAD,为什么不使用它呢?
–odinho-费尔蒙特
2014年8月3日,9:55
还会重置本地更改吗? #请更新。
– CoDe
16年4月11日在11:07
这对我来说非常有效,像这样复位头部比这里一半的答案有意义得多。
– VardaElentári
16-09-22在18:00
HEAD ^是否等于HEAD之前的提交?和^^是两次提交吗?猜猜这不适用于快速前进合并吗?
–马库斯·莱昂(Marcus Leon)
16-9-28在16:17
#7 楼
最近,我一直在使用git reflog
来帮助解决此问题。这仅在合并刚刚发生且仅在您的计算机上时才有效。 git reflog
可能返回类似以下内容:fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting
第一行表明发生了合并。第二行是我合并之前的时间。我只是简单地
git reset --hard 43b6032
强制此分支从合并和继续之前跟踪。评论
好答案,谢谢!需要撤消合并,但其他答案只是使它更加混乱,使用reflog获取SHA并将其传递给git reset即可。
– Lankymart
19年1月21日15:10
#8 楼
使用现代Git,您可以:git merge --abort
旧语法:
git reset --merge
老派:
git reset --hard
但是实际上,值得注意的是,鉴于存在
git merge --abort
,git reset --merge
仅等效于MERGE_HEAD
。可以在Git帮助中的合并命令中读取。git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
合并失败后,如果没有
MERGE_HEAD
,则可以使用git reset --merge
撤消失败的合并,但是我个人认为
git merge --abort
在日常工作中更加强大和有用,因此我经常使用它。/>
评论
对我来说很棒。其他每篇文章都说这是如此复杂,但这确实符合预期。我认为它之所以起作用是因为存在冲突,而这并不能完全回答最初的问题。
–杰里米
15年7月7日在23:56
这个答案不关注OP的情况,而忽略了重要的上下文。
–本·惠勒
15年10月13日在22:26
#9 楼
好的,这里其他人给我的答案很接近,但是没有用。这就是我所做的。执行此操作...
git reset --hard HEAD^
git status
...为我提供了以下状态。
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
然后我不得不多次输入相同的
git reset
命令。每次执行此操作时,该消息都会更改一个,如下所示。> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
此时,我看到状态消息已更改,因此我尝试执行
git pull
,似乎可行:> git pull
Updating 2df6af4..12bbd2f
Fast forward
app/views/truncated | 9 ++++++---
app/views/truncated | 13 +++++++++++++
app/views/truncated | 2 +-
3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master
长话短说,我的命令归结为:
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
评论
或者您可能已经使用HEAD ^^^^
–hasen
2010-3-5在22:57
甚至可以重置为原点/母版;)
–hasen
10 Mar 5 '10在23:01
#10 楼
您必须更改HEAD,当然不是git HEAD...。因此,在回答之前,让我们添加一些背景知识,解释一下这是什么
HEAD
。First of all what is HEAD?
HEAD
只是对当前分支上当前提交(最新)的引用。在任何给定时间只能有一个
HEAD
。 (不包括git worktree
)HEAD
的内容存储在.git/HEAD
内部,并且包含当前提交的40个字节SHA-1。detached HEAD
如果您不在最新的提交上,则意味着
HEAD
指向历史上的先前提交,称为detached HEAD
。在命令行上,它看起来像这样-SHA-1而不是分支名称,因为
HEAD
并不指向当前分支的尖端。关于如何从分离的HEAD中恢复的几种选择:
git checkout
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
这将结帐新分支指向所需的提交。
此命令将签出到给定的提交。
此时,您可以创建一个分支并从此位置开始工作。
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
您也可以始终使用
reflog
。 git reflog
将显示更新HEAD
的所有更改,并且签出所需的reflog条目会将HEAD
设置回此提交。 每次修改HEAD时,
reflog
中都会有一个新条目git reflog
git checkout HEAD@{...}
这将使您返回到所需的提交
git reset --hard <commit_id>
“移动”您的HEAD返回所需的提交。
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
注意:(自Git 2.7起)
还可以使用
git rebase --no-autostash
。git revert <sha-1>
“撤消”给定的提交或提交范围。
reset命令将“撤消”在给定提交中所做的任何更改。
将提交带有撤消补丁的新提交,而原始提交也将保留在历史记录中。
< pre class =“ lang-sh prettyprint-override”>
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
此架构说明了哪个命令执行的功能。
如您所见,
reset && checkout
修改了HEAD
。评论
这是宝贝🐱🐱👤🐱👤🐱
–贾旺·辛格(Jawand Singh)
19年11月1日在11:32
#11 楼
您可以使用git reflog
查找先前的结帐。有时候,这是您要返回的一种良好状态。具体地,
$ git reflog
$ git reset --hard HEAD@{0}
评论
谢谢!您节省了我半天的时间。但是我无法使用任何命令退出reflog模式。
– Katarzyna
15年2月13日在8:42
@Katarzyna使用“ q”键退出reflog
– Amjed Baig
15年5月8日在17:09
#12 楼
如果您正在合并中,可以随时中止它git merge --abort
评论
谢谢兄弟,我正要做那个可怕的东西正确的答案。幸运的是我向下滚动。我只想删除合并头
– Nyuu
19年4月13日在13:22
#13 楼
我能够使用一个不涉及查找提交ID的命令来解决此问题。git reset --hard remotes/origin/HEAD
可接受的答案对我不起作用,但这命令达到了我想要的结果。
评论
究竟!它将您的更改重置为分支的HEAD!不一一做
–卡洛斯·齐纳托(Carlos Zinato)
18/09/21在13:05
没有为我工作。最终导致将本地分支机构寄回一两个月。值得庆幸的是,这些都是本地的,因此我可以随时销毁该分支并再次获取它。只是想指出,以防其他人尝试这样做。
–马特·彭格利(Matt Pengelly)
19年6月3日在20:16
@MattPengelly此方法在很大程度上没有记录,通常在合并之前分支与远程分支同步时才有效。您的分支与远程分支同步以来已经有几个月了吗?
–拉尔夫·里托奇(Ralph Ritoch)
19年6月6日在9:51
@MattPengelly还取决于HEAD指向哪个分支。我在其中一个项目上使用gitflow,即使我在开发分支上,也将remotes / origin / HEAD指向origin / master,因此,如果我需要撤消合并,则可能需要重置为remotes /起源/发展
–拉尔夫·里托奇(Ralph Ritoch)
19年6月6日在9:55
#14 楼
可以通过多种方式完成。1)中止合并
如果您处于合并错误(错误地用错误的分支完成)之间,并且想要避免合并,请返回最新分支如下所示:
git merge --abort
2)将HEAD重置为远程分支
如果您是从远程开发分支工作,则可以将HEAD重置为远程分支上的最后一次提交如下:
git reset --hard origin/develop
3)删除当前分支,然后再次从远程存储库中签出
考虑到在本地仓库中与远程/开发分支同步的开发分支中工作,您可以执行以下操作:
git checkout master
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :)
git branch -D develop
git checkout -b develop origin/develop
评论
“ 1)中止合并”已经足够了。正在投票。
– CodeToLife
1月6日13:32
小心! git merge --abort“只能在合并导致冲突后运行。git merge --abort将中止合并过程,并尝试重建合并前状态”
– PedroGarcíaMedina
4月7日4:30
git reset --hard origin / develop这就是我想要的,谢谢!
–马提斯达达
7月13日8:30
#15 楼
如果尚未提交,则只能使用$ git checkout -f
,它将撤消合并(以及所做的所有操作)。
评论
对此进行了尝试,实际上它增加了我本地分支机构即将提交的提交次数。
–巴克莱
2015年3月5日23:25
#16 楼
遇到这个问题时,也希望还原为匹配原点(即,在原点之前没有提交)。进一步研究,发现有一个reset
命令正好适合于:git reset --hard @{u}
注意:
@{u}
是origin/master
的简写。 (当然,您需要该远程存储库才能正常工作。)#17 楼
最简单的答案是odinho-Velmont提供的答案首先要做
git reset --merge ORIG_HEAD
对于那些希望在推动更改后进行重置的人,请这样做
(因为这是有关任何git reset merge问题的第一篇文章)
git push origin HEAD --force
这将以某种方式重置,使您在拉动后不会再次获得合并的更改。
#18 楼
只是为了查看其他选项,我主要遵循此处描述的分支模型:http://nvie.com/posts/a-successful-git-branching-model/,因此已与--no-ff
合并(通常没有快进)。 我刚刚读了此页面,因为我不小心将测试分支而不是发布分支与master合并以进行部署(网站,master是实时的)。测试分支还有另外两个分支与之合并,总计约六次提交。
因此,要还原整个提交,我只需要一个
git reset --hard HEAD^
即可还原整个合并。由于合并不是快速转发,因此合并是一个块,而后退一步是“分支未合并”。#19 楼
您只能使用两个命令来还原合并或通过特定的提交重新启动:git reset --hard commitHash
(应使用要重新启动的提交,例如44a587491e32eafa1638aca7738) git push origin HEAD --force
(将新的本地master分支发送到起源/ master)祝你好运,继续吧!
#20 楼
如果您的合并和相应的提交尚未被推送,则始终可以切换到另一个分支,删除原始分支并重新创建它。例如,我不小心将一个develop分支合并到master和想要撤消。使用以下步骤:
git checkout develop
git branch -D master
git branch -t master origin/master
Voila!母版与原件处于同一阶段,并且您误合并的状态也将被清除。
评论
注意:这不仅会撤消合并,还会撤消自最新推送到原始位置以来进行的任何本地提交。
–马丁·海默斯(Martijn Heemels)
2012年10月24日16:48
#21 楼
如果您想使用命令行解决方案,建议使用MBO的答案。如果您是新手,则可能会喜欢图形化方法:
启动
gitk
(从命令行启动,或者在文件浏览器中右键单击)(),您可以轻松地在此处发现合并提交-顶部有两个父节点的第一个节点
链接到第一个/左父级(合并前您当前分支中的那个,对我来说通常是红色的)
在选定的提交上,右键单击“将分支重置到此处”,在此处进行硬重置
#22 楼
策略:从一切都很好的地方创建一个新分支。理性:恢复合并非常困难。解决方案太多,取决于许多因素,例如您是否提交或推送了合并,或者自合并以来是否有新的提交。同样,您仍然需要对git有相对深入的了解,以使这些解决方案适合您的情况。如果您盲目地遵循一些说明,则可以得到“空合并”,其中什么都不会合并,并且进一步的合并尝试将使Git告诉您“已经是最新的”。
解决方案:
假设您要将
dev
合并到feature-1
中。查找要接收合并的修订:
git log --oneline feature-1
a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
签出(回到过去):
git checkout e5f6g7h8
创建新分支从那里检查:
git checkout -b feature-1
现在您可以重新启动合并:
合并:
git merge dev
解决合并冲突。
提交:
git commit
如果对结果满意,请删除旧分支:
git branch --delete feature-1
#23 楼
如果分支被清除而不被推送。然后下面的git reset命令将撤消合并:git reset --merge ORIG_HEAD
#24 楼
只需创建一个新分支,然后对所需的分支进行挑选即可。它的保护程序更加简单,然后重置,如上面许多答案中所述
评论
我同意这个建议,尤其是如果您对所列的git命令不完全满意时。随着“辛劳”的增加,这可能会变慢,但是如果它没有太多发挥,并且您担心失去工作,那是值得的。
–格雷格
2月5日18:06
#25 楼
我认为您可以执行git rebase -i [hash] [branch_name]
,其中[hash]
是要倒带的倒数加上一个(或想要倒回的提交数不多)的标识哈希,然后在编辑器中删除不需要的行还有。保存文件。出口。祈祷。应该倒退。您可能必须执行git reset --hard
,但是这时应该很好。如果您不想将特定的提交保留在历史记录中,则还可以使用它从堆栈中拉出特定的提交,但这会使您的存储库处于您可能不希望的状态。#26 楼
如果您提交了合并:git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
#27 楼
首先,确保已完成所有操作。
然后将存储库重置为先前的工作状态:
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
或使用
--hard
(这将删除所有未提交的本地更改!):$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
使用错误合并的提交之前的哈希值。
通过以下方法检查您想在先前正确版本的顶部重新提交的提交:
$ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
...
commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
...
应用您可以通过以下方式在您的存储库的正确版本上进行正确的提交:
通过使用cherry-pick(某些现有提交所引入的更改)
git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
或通过以下方式挑选提交范围:
在合并之前首先检查正确的更改它们:
git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
在合并它们之前先检查正确的更改:
git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
其中这是正确提交的范围,y您已提交(不包括错误提交的合并)。
#28 楼
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
这对我有用.. !!
#29 楼
如果您发现您需要在合并后立即还原,并且在合并尝试之后还没有执行其他任何操作,则可以发出以下命令:git reset --hard HEAD@{1}
。本质上,您的合并如果合并后未执行其他任何操作,则
sha
将指向HEAD@{0}
,因此HEAD@{1}
将是合并之前的前一点。#30 楼
最简单的机会,比这里所说的要简单得多:删除本地分支(本地,而不是远程)并再次将其拉出。这样,您将撤消master分支上的更改,并且任何人都会受到您不想推送的更改的影响。重新开始。
评论
如果您需要保存历史记录,换句话说,就是有人曾经从您那里拉过钱,或者您已经将它推到某个地方,请使用下面的Yuri Ushakov解答中的解决方案!请取消选择当前的中奖答案,尽管仍在收集选票,但这是不安全的(许多人指出)。对我来说,“ MBO” -s看起来最好,尽管它的得分要少得多。
如果您需要保存历史记录,请使用下面的Yuri解决方案! (只需将链接添加到@Sedrik评论)
相关:恢复为先前的Git提交。
这是来自Github的大量资源:如何使用Git撤消(几乎)任何操作