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

Lav*_*chi 88 git commit repository reset git-bare

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

git reset --hard HEAD^ 
Run Code Online (Sandbox Code Playgroud)

不是解除对此类存储库中的最后一次更改的解除.

搜索通过互联网,所有我能找到相关的话题就是这个,在我提出这样做的方式有三种:
1."手动更新裁判(其中涉及水暖)";
2." git push -f来自非裸库";
3." git branch -f this $that".

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

Syl*_*sne 126

您可以使用该git update-ref命令.要删除最后一次提交,您将使用:

$ git update-ref HEAD HEAD^
Run Code Online (Sandbox Code Playgroud)

或者,如果您不在您无法删除最后一次提交的分支中:

$ git update-ref refs/heads/branch-name branch-name^
Run Code Online (Sandbox Code Playgroud)

如果你想要你也可以传递一个sha1:

$ git update-ref refs/heads/branch-name a12d48e2
Run Code Online (Sandbox Code Playgroud)

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

  • 这些例子对于`branch-name`参数有误导性.当使用带有"分支"的`update-ref`时,你必须指定分支的完整引用名称(即将`refs/heads /`添加到正常的短分支名称之前).如果你只是使用短名称,你将最终创建/更新`$ GIT_DIR/branch-name`而不是`$ GIT_DIR/refs/heads/branch-name`.`branch-name`和`refs/heads/branch-name`的存在将导致"refname ... is ambiguous"警告. (3认同)

Haz*_*zok 30

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

git reset --soft <commit>
Run Code Online (Sandbox Code Playgroud)

然后你不会遇到你使用的问题--hard--mixed裸仓库中的选项,因为你没有尝试改变裸仓库没有的东西(即工作树和索引).在你的情况下,你会想要使用(从裸仓库):

git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)

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

git symbolic-ref HEAD refs/heads/<branch_name>
Run Code Online (Sandbox Code Playgroud)

  • 如何选择要移动的分支?你的例子在master上运行正常但是`git checkout other_branch`在裸机上不起作用. (2认同)

Von*_*onC 7

git push -f应工作的优良:
假如克隆了裸回购,除去最后提交的(git reset --hard HEAD^你提到,但在当地的一个非裸露的回购协议),并推回(-f):

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

  • @Zach:`reset --soft`应该直接在一个裸仓库上完成.我怀疑这很少做,因为一个简单的回购通常是**上游回购**(即你推送数据的回购),而且大多数时候,你*没有*直接本地访问它.但如果你这样做,那么这肯定是"重置 - 软件"使用的另一个好例子(如http://stackoverflow.com/questions/5203535/practical-uses-of-git-reset-soft)所以+1给你的答案. (2认同)