为什么允许在一个独立的HEAD上进行攻击?

时间:2016-05-21 08:11:11

标签: git workflow commit

现在我再次提交给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的行为吗?

1 个答案:

答案 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根据需要处理它。)