git - 为什么允许在分离的 HEAD 上提交?

标签 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 的方式只是业余的,但我想我现在必须撤消该提交并 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/

相关文章:

html - 如何在 Github 上将 HTML 页面视为正常呈现的 HTML 页面以在浏览器中查看预览,而无需下载?

java - 免费/开源 Java 规则/工作流引擎

java - Spring批处理中的提交间隔和处理回滚

php - 表达式引擎: Synchronising development and live environments

python - 连接或游标上是否使用了提交?

bash - svn 从 bash 脚本提交而不打开编辑器

git - 如何忽略已经提交的文件?

git - 在已推送的 Git 中编辑不正确的提交消息

git - 恢复 git merge ?

deployment - 配置 Hudson/Jenkins 以进行登台和生产