我怎样才能在git裸存储库中取消提交最后一次提交?

时间:2011-01-07 11:13:08

标签: git repository commit reset git-bare

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

git reset --hard HEAD^ 

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

通过互联网搜索,我发现与该主题相关的所有内容都是this,其中我提供了三种方法: 1.“手动更新参考(涉及管道)”; 2.来自非裸存储库的“git push -f”; 3.“git branch -f this $that”。

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

4 个答案:

答案 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):

  • 您不会为删除之前的其他提交更改任何SHA1。
  • 你确定你推回了裸仓的确切内容减去了额外的提交(因为你先克隆了它)。

答案 3 :(得分:2)

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

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

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