Git - 删除最后一次提交(历史记录重写)

时间:2016-01-25 00:53:11

标签: git github

问题是关于历史重写:删除最后一次提交 (这个问题是如何做到这一点,没有讨论是坏还是好) 所以,想象一下最后一次提交的SHA是" dd61ab32"。 远程和本地同步,我们执行以下命令来撤消上次提交:

$ git push origin +dd61ab32^:master
$ git reset HEAD^ --hard
$ git push -f origin master

据我所知,第一个将删除远程的最后一次提交。 第二个,将本地工作重置为上一个本地提交,( - hard将完全删除所有更改, - 软件将撤消上次提交,但更改将保存为未分级) 但是第三个命令做了什么?我明白这很重要,因为没有它,就会搞砸了。

你能告诉我最后一个,第三个命令是做什么的吗?

UPD:

谢谢你的回答。目前还不清楚。我还有一个额外的问题,是不是第一个命令使当前的HEAD远程到前一个?解释"它无效"。好的,我会尝试解释,我需要哪个答案。我的意思是,当我做第一次命令时,我可以直观地看到,发生了什么。同样的事情适用于第二个命令。但是第三个命令是不同的,因为它很重要,但我无法直观地看到它为什么重要。看起来多余。你能描述更多细节吗?

2 个答案:

答案 0 :(得分:4)

就像你说的那样,最后一个命令是多余的。然而,这并不是理想的做法。 Git应该总是在本地进行更改,然后将其推送到远程(除非你拉其他人的更改)所以正确的命令序列将是:

git reset --hard HEAD~1
git push -f origin master

这假设HEAD指向master中的最后一次提交。

答案 1 :(得分:0)

当您将更改推送到远程时,您只能推送作为其当前头的后代的提交。如果在与遥控器同步后在本地删除或更改提交,则无法推送这些更改。但是,-f的{​​{1}}标志告诉git推送提交,尽管它通常是无效的。

git之所以如此工作,是因为如果你重写git存储库的历史记录,那么与旧提交同步的用户在重写历史记录后会从远程数据库中提取问题。因此,只有在100%确定在推送新提交之前没有其他人已经删除或更改了提交时,您才应该这样做。