我怎样才能取消提交git仓库中的最后一个提交?

考虑到有几个git命令在裸存储库中是没有意义的(因为裸存储库不使用索引并且没有工作目录),

git reset --hard HEAD^ 

不是一个解决scheme来取消在这样的存储库中的最后一个变化。

通过互联网search,我所能find的与这个主题相关的就是这个 ,我在这里给出了三种方法:
1.“手动更新参考(涉及pipe道)”;
2.“ git push -f从非裸仓库”;
3.“ git branch -f this $that ”。

你认为哪种解决scheme更合适?还有其他方法可以做到这一点? 不幸的是,我发现有关git仓库的文档相当糟糕。

非常感谢你,
拉维尼亚

你可以使用git update-ref命令。 要删除最后一个提交,你可以使用:

 $ git update-ref HEAD HEAD^ 

或者如果你不在你不能删除最后一个提交的分支中:

 $ git update-ref refs/heads/branch-name branch-name^ 

如果你愿意,你也可以通过sha1:

 $ git update-ref refs/heads/branch-name a12d48e2 

请参阅git-update-ref命令的文档。

如果您在裸回购中使用以下内容:

 git reset --soft <commit> 

那么你不会遇到你使用的问题 – --mixed和 – --mixed选项裸回购,因为你不是试图改变裸回购没有(即工作树和索引)的东西。 在你的情况下,你会想要使用(从裸回购):

 git reset --soft HEAD^ 

要在远程回购上切换分支,请执行以下操作:

 git symbolic-ref HEAD refs/heads/<branch_name> 

git push -f应该可以正常工作:
如果你克隆裸回购,删除最后一次提交( git reset --hard HEAD^如你所说,但在本地非裸回购),并推回( -f ):

  • 您不会更改您删除的之前的其他提交的任何SHA1。
  • 你可以肯定的是,你将裸回购的确切内容减去额外的提交(因为你刚刚克隆了它)。

你也可以使用git refspec符号来做这样的事情:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

这强制更新目标分支(如ref所示)到源提交,如+<object ref>部分所示。