现在我再次提交给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的方式只是业余的,但我想我现在必须撤消提交和结账,例如master
并重新提交或创建一个分支并合并回我想要提交的分支。
对我来说,提交一个未命名的快照看起来像一个低级别的程序,至少应该被警告(如果不是禁止的话)
为什么允许提交分离的HEAD?什么时候有用?
可以通过全局选项改变git
的行为吗?
答案 0 :(得分:3)
人们可以同样地问及“为什么不&#34 ;;但实际上,许多Git内部操作都在使用它。最明显的是git rebase
,它在一个独立的HEAD上开始复制提交(在执行交互式rebase时使用git cherry-pick
,在执行非交互式rebase时使用等效项)。在大多数情况下,这些使用其他命令,但实际上交互式rebase偶尔会直接运行git commit
,尤其是--amend
形式。
然后可以指出这些命令可以使用管道命令,而不是git commit
本身。 (事实上,有些人会这样做:例如,git stash
使用git commit-tree
。)
还可以重写Git。 :-)在某些时候,这只是太多的努力。
如果你想确保你个人在提交之前没有处于独立的头脑中,那就自己制作一个小脚本,例如:
$ git ci
not committing: in detached-HEAD state
或编写一个pre-commit
挂钩来检查已分离的HEAD,并要求您使用--no-verify
绕过它以在该状态下进行提交。 (后者将干扰交互式rebase中的reword
。)
(要检查HEAD是否为符号引用,请使用git symbolic-ref HEAD
,它会打印HEAD
指向或失败的分支的名称。添加-q
以获得退出status,可以用来制作更好的错误消息。将分支名称写入shell变量,或者/dev/null
根据需要处理它。)