考虑到有几个git命令在裸存储库中没有意义(因为裸存储库不使用索引而没有工作目录),
git reset --hard HEAD^
不是解除此类存储库中最后一次更改的解决方案。
通过互联网搜索,我发现与该主题相关的所有内容都是this,其中我提供了三种方法:
1.“手动更新参考(涉及管道)”;
2.来自非裸存储库的“git push -f
”;
3.“git branch -f this $that
”。
您认为哪种解决方案更合适或有什么其他方法可以做到这一点?不幸的是,我发现的关于git bare存储库的文档相当差。
答案 0 :(得分:120)
您可以使用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命令的文档。
答案 1 :(得分:29)
如果您在裸仓库中使用以下内容:
git reset --soft <commit>
然后你不会在裸仓库中使用--hard
和--mixed
选项遇到问题,因为你没有尝试改变裸仓库没有的东西(即工作)树和索引)。在你的情况下你特别想要使用(来自裸仓):
git reset --soft HEAD^
要switch branches on the remote repo执行:
git symbolic-ref HEAD refs/heads/<branch_name>
答案 2 :(得分:7)
git push -f
应该可以正常工作:
如果你克隆那个裸存储库,删除最后一次提交(git reset --hard HEAD^
,如你所提到的,但在本地非裸存储库中)并推回(-f
):
答案 3 :(得分:2)
您也可以使用git refspec表示法并执行以下操作:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
这会强制将目标分支(由ref表示)更新为源代码提交,如+<object ref>
部分所示。