我了解在运行$ git checkout --detach
时发生的内部操作。
当我在master
分支上运行$ git checkout --detach
时,我的.git/HEAD
不会指向ref: refs/heads/master
,而是指向一个哈希值(与refs/heads/master
相同)。
在什么情况下,我会真正想要这样做呢?
我了解在运行$ git checkout --detach
时发生的内部操作。
当我在master
分支上运行$ git checkout --detach
时,我的.git/HEAD
不会指向ref: refs/heads/master
,而是指向一个哈希值(与refs/heads/master
相同)。
在什么情况下,我会真正想要这样做呢?
git checkout some-branch^0
实现相同的结果。tl;dr:检出已经在另一个工作树中检出的分支是不允许的。
输入git checkout --detach master
现在更清楚地解释一下如何出现这种情况,以下是我个人如何使用git checkout --detach
的真实世界示例。
我正在开发一个名为 midimap 的程序,并且还有一个稳定的长期运行的后台进程。
为此,我利用了两个工作树:~/vc/github.com/fossegrim/midimap
(以下简称 DEV)用于开发和 ~/vc/github.com/fossegrim/midimap-stable
(以下简称 STABLE) 用于长期运行的进程。
当我启动计算机时,我在STABLE中运行midimap程序,并在DEV中打开GNU Emacs。随着我在DEV中进行项目工作,最终会到达一个我想要将USAGE工作树更新为DEV更改内容的点。
由于检出已经在另一个工作树中检出的分支是不允许的。因此,我必须以另一种方式检出它:git checkout --detach master
。
当你在多人开发环境中工作时,你可能会在代码审查过程中想要尝试某些代码更改,以便更好地理解其他开发人员所做的工作,从而提供更好的反馈。
你添加的任何提交都悬挂在空中,实际上没有添加到任何分支中。
然后,其他开发人员调整代码并推送新的提交。
之后,你只需执行一次fetch和checkout--detached原始分支即可,无需显式丢弃任何内容或解决合并冲突。
你实际上也没有在本地物理上获取分支,因此在完成代码审查后,你不需要删除分支(或你添加的提交)。
命令git checkout origin/master --detach
允许你检出分支指向的提交,而不必真正获取和跟踪分支本身。任何更改和提交你创建的都将自动被丢弃(包括“分支”本身),一旦你切换到另一个分支,你就不必手动删除它们。
--detach
标志,因为您只需将修订说明符拼写为例如refs/heads/master
。因此,该标志本身仅供方便之用。但Oliver Charlesworth的回答是正确的——这只是关于请求方式拼写的旁注。 :-) - torek