现在,我再次提交了一个 git 子模块,而之前没有检查 master
(或任何其他分支):
╭─some@machine ~/some/poject/submodules/coollib ‹cbc6ecc*›
╰─$ git commit -am"some message"
[detached HEAD 0538b11] some message
2 files changed, 13 insertions(+), 2 deletions(-)
也许我使用 git 的方式只是业余的,但我想我现在必须撤消该提交并 checkout ,例如master
并重新提交或创建一个分支并 merge 回我想要提交的分支。
对我来说,提交未命名的快照看起来像是一个低级过程,至少应该警告(如果不禁止)
为什么允许提交到分离的 HEAD?这什么时候有用?
可以通过全局选项更改 git
的行为吗?
最佳答案
人们同样可以问“为什么不”;但事实上,许多 Git 内部操作都利用了这一点。最明显的是 git rebase,它获取分离的 HEAD 并开始复制提交(在进行交互式 rebase 时使用 gitcherry-pick,以及在执行非-交互式 rebase )。大多数情况下,它们使用其他命令,但实际上交互式 rebase 偶尔会直接运行 git commit
,特别是在 --amend
形式中。
人们可以指出这些命令可以使用管道命令,而不是 git commit
本身。 (事实上,有些是这样做的:例如,git stash
使用git commit-tree
。)
人们还可以重写 Git。 :-) 在某些时候,这只是太多的努力。
如果您想确保自己在提交之前不会处于超然状态,请为自己制作一个执行此操作的小脚本,例如:
$ git ci
not committing: in detached-HEAD state
或者编写一个预提交
钩子(Hook)来检查分离的HEAD,并要求您使用--no-verify
绕过它以在该状态下进行提交。 (后者会干扰交互式 rebase 中的reword
。)
(要检查 HEAD 是否是符号引用,请使用 git symbolic-ref HEAD ,它会打印 HEAD 指向的分支的名称,否则会失败。添加-q
仅获取退出状态,您可以使用它来制作更好的错误消息。将分支名称写入 shell 变量,或写入 /dev/null
根据需要丢弃它。)
关于git - 为什么允许在分离的 HEAD 上提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360485/