【问题标题】:How can I uncommit the last commit in a git bare repository?如何取消提交 git 裸存储库中的最后一次提交?
【发布时间】:2011-06-05 05:21:41
【问题描述】:

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

git reset --hard HEAD^ 

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

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

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

【问题讨论】:

  • @Lavinia-Garbriela Dobrovol 不要使用以下复杂的东西。您正在尝试将 HEAD 移至不同的提交,这就是 git reset 的目的,即使在裸仓库中也是如此。根据我在下面的回答,使用: git reset --soft 使用 --soft,您不会尝试更改不存在的工作树和索引,因此 git 可以让您毫无问题地进行重置。

标签: git repository commit reset git-bare


【解决方案1】:

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

【讨论】:

  • @Lavinia-Gabriela Dobrovolschi:对,我不熟悉确切的语法。
  • @VonC 您可以将git update-ref <ref> <newvalue> 中的 指定为正确的分支,例如“refs/heads/master”而不是 HEAD。希望我没有误解你的问题。
  • @Sylvain:+1 好编辑。 @Lavinia-Gabriela Dobrovolschi 感谢您的精确。这更实用(如果您可以直接访问远程服务器,我想)。
  • 这些示例在 branch-name 参数方面具有误导性。当使用带有“分支”的update-ref 时,您绝对必须指定分支的完整引用名称(即在正常的短分支名称前加上refs/heads/)。如果您只使用短名称,您最终将创建/更新$GIT_DIR/branch-name 而不是$GIT_DIR/refs/heads/branch-namebranch-namerefs/heads/branch-name 的存在将导致“refname ... is ambiguous”警告。
  • 这个答案比 Zach 提出的要复杂得多。他的解决方案效果很好。
【解决方案2】:

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

git reset --soft <commit>

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

git reset --soft HEAD^

switch branches on the remote repo 做:

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

【讨论】:

  • 如何选择要移动的分支?您的示例在 master 上运行良好,但 git checkout other_branch 不能在裸机上运行。
  • 嗯...我想知道是谁投了我反对票。该问题没有询问如何在远程仓库上切换分支,而是询问如何在裸仓库上重置。要更改远程仓库中的默认分支,请使用 git symbolic-ref HEAD refs/heads/.
【解决方案3】:

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

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

【讨论】:

  • @VonC 嗨,Von,我看到你在 Git 上回答了很多,所以想问你...我很好奇,为什么git reset --soft &lt;sha1&gt; 不如下我的回答所示在裸仓库上移动 HEAD 的推荐做法?
  • 我想我问的另一个原因是,对裸回购使用软重置并不是现成的信息,而且许多论坛似乎有不必要的复杂解决方法,因为软重置似乎是最佳实践以最少的打字量和最少的出错机会。
  • @Zach: reset --soft 应该在直接在裸仓库上完成时工作。我怀疑这很少这样做,因为裸仓库通常是上游仓库(即您正在向其推送数据的仓库),并且大多数时候,您 可以直接在本地访问它。但如果你这样做了,那么这肯定是另一个使用“reset --soft”的好例子(如stackoverflow.com/questions/5203535/…)所以+1 给你的答案。
【解决方案4】:

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

git push -f origin +&lt;commit you want to revert to&gt;:&lt;destination_head | branch_name&gt;

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

【讨论】:

  • 除非分支上有 acl - 如果您“需要在裸仓库本身上执行此操作”通常是这种情况 ...
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多