97

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

git reset --hard HEAD^ 

不是取消提交此类存储库中最后一次更改的解决方案。

在互联网上搜索,我能找到与该主题相关的所有内容都是this,其中向我展示了三种方法:
1.“手动更新 ref(涉及管道)”;
2.“git push -f来自非裸存储库”;
3.“ git branch -f this $that”。

您认为哪种解决方案更合适,或者有什么其他方法可以做到这一点?不幸的是,我发现的关于 git 裸存储库的文档相当糟糕。

4

4 回答 4

138

您可以使用该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命令的文档。

于 2011-01-07T12:24:56.840 回答
35

如果您在裸仓库中使用以下内容:

git reset --soft <commit>

那么您就不会遇到在裸仓库中使用的问题--hard--mixed选项,因为您没有尝试更改裸仓库没有的东西(即工作树和索引)。在您的情况下,您特别希望使用(来自裸仓库):

git reset --soft HEAD^

在远程仓库上切换分支,请执行以下操作:

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

要查看当前选定的分支,请使用:

git symbolic-ref HEAD

https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

于 2011-04-11T21:30:19.787 回答
6

git push -f应该可以正常工作:如果您克隆该
裸仓库,请删除最后一次提交(git reset --hard HEAD^正如您提到的,但在本地非裸仓库中)并推回(-f):

  • 对于您删除的提交之前的其他提交,您不会更改任何 SHA1。
  • 你确定你推回了裸仓库的确切内容减去额外的提交(因为你只是先克隆了它)。
于 2011-01-07T11:44:02.713 回答
2

您还可以使用 git refspec 表示法并执行以下操作:

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

这会强制将目标分支(由 ref 表示)更新为由+<object ref>部分表示的源提交。

于 2012-01-31T08:03:37.857 回答