Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git-删除上次提交(历史重写)_Git_Github - Fatal编程技术网

Git-删除上次提交(历史重写)

Git-删除上次提交(历史重写),git,github,Git,Github,问题是关于历史重写:删除最后一次提交 (这个问题更像是如何做到这一点,而不是讨论它是好是坏) 因此,假设最后一次提交的SHA是“dd61ab32”。 远程和本地同步,我们执行以下命令撤消上次提交: $ git push origin +dd61ab32^:master $ git reset HEAD^ --hard $ git push -f origin master 据我所知,第一个将在远程删除最后一次提交。 第二个,将本地工作重置为上一个本地提交,(-硬将完全擦除所有更改,-软将撤消上

问题是关于历史重写:删除最后一次提交 (这个问题更像是如何做到这一点,而不是讨论它是好是坏) 因此,假设最后一次提交的SHA是“dd61ab32”。 远程和本地同步,我们执行以下命令撤消上次提交:

$ git push origin +dd61ab32^:master
$ git reset HEAD^ --hard
$ git push -f origin master
据我所知,第一个将在远程删除最后一次提交。 第二个,将本地工作重置为上一个本地提交,(-硬将完全擦除所有更改,-软将撤消上一次提交,但更改将保存为未保存) 但是第三个命令做什么呢?我知道它做了一件重要的事情,因为没有它,事情就搞砸了

你能告诉我最后第三个命令是什么吗

UPD:


谢谢你的回答。现在还不清楚。我有一个额外的问题,第一个命令不会使当前的头与前一个头相距很远吗?解释“它是无效的”。好的,我会试着解释,我需要哪一个答案。我的意思是,当我执行第一个命令时,我可以直观地看到发生了什么。同样的情况也适用于第二个命令。但第三个命令是不同的,因为它很重要,但我看不出它为什么重要。看起来是多余的。您能更详细地描述一下吗?

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


git这样工作的原因是,如果您重写git存储库的历史记录,那么在重写历史记录之后,与旧提交同步的用户将无法从远程进行提取。因此,只有当您100%确定在推送新命令之前没有其他人推送已删除或更改的提交时,才应该这样做。

如您所说,最后一个命令是多余的。然而,这并不是理想的方法。Git应该始终在本地进行更改,然后将其推送到远程(除非您正在拉别人的更改),因此正确的命令顺序是:

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

这是假设头部指向master中的最后一次提交

-f--force通常,该命令拒绝更新远程引用,该远程引用不是用于覆盖它的本地引用的祖先。此外,当使用--force with lease选项时,该命令拒绝更新当前值与预期值不匹配的远程引用。此标志禁用这些检查,并可能导致远程存储库丢失提交;小心使用。
从手册页开始,谢谢。我要读关于裁判的书。如果没有这一点,我很难理解这个问题。第三个命令还从远程“删除”以前的提交。依我看,这是最好的方法,因为它不需要知道上一次提交的SHA哈希。谢谢你的回答。第二段很清楚,这一行动的理由。但是我有一个额外的问题,第一个命令不是使当前的头与前一个远程吗?现在还不清楚。解释“它是无效的”。好的,我会试着解释,我需要哪一个答案。我的意思是,当我执行第一个命令时,我可以直观地看到发生了什么。同样的情况也适用于第二个命令。但第三个命令是不同的,因为它很重要,但我看不出它为什么重要。看起来是多余的。你能更详细地描述一下吗?很有趣。让我检查一下以确保这个顺序的正确性。实际上我在这里找到了这三个步骤: