当我尝试在同一提交中签出其他标签时遇到问题。
这在我检查分离头在哪里的应用程序中成为一个问题。
我认为这是因为提交同时被4.1和4.1.1标记,但是当我从4.1.1标记中检出标记/4.1时,我需要头部明确地说“ HEAD at detached at 4.1”相同的“ HEAD从4.1.1分离”文本。
无法从4.1-> 4.1.1更新
无法从4.1.1-> 4.1更新
在最后一次检出中,我无法从4.1切换到4.1.1,可能是因为HEAD已经在提交中,是否有某种方式强制“ HEAD分离为N”,而不像在这种情况下检出master分支,并且然后检查标签。
由于应该在生产中使用此功能,因为此时可能会有一些在线用户,所以我希望结帐尽可能平滑且 clear (分离头部)。
答案 0 :(得分:2)
TL; DR:显然,您必须作弊。我不建议这样做,但请在下面说明其工作方式。
在上一次结帐时,我无法从4.1切换到4.1.1,可能是因为HEAD已经在提交中了...
或多或少,是的。准确地说,从4.1到4.1.1的“切换”根本没有切换任何内容,因为4.1和4.1.1是相同的提交。 Git采取捷径并且根本不写任何东西,因为不需要编写任何东西。好吧,除了:
是否有某种方式强制“ HEAD从N分离”,而不是像在这种情况下签出master分支然后签出标签一样。
git status
报告的“与……分离”是基于HEAD
reflog 中留下的面包屑痕迹。当您为某些 X 运行git checkout X
且Git更新HEAD
时,Git首先将HEAD
的 current 值保存到reflog中。 HEAD
,以及诸如此类的评论:
8858448bb4 HEAD@{0}: checkout: moving from pu to master
({pu
是Git本身在Git存储库中的“提议的更新”或“提取”分支,因此上面的条目是我做git checkout pu
的结果,它创建了{{1} },从pu
开始,给它赋值origin/pu
,然后再赋给8265814db9543fbaf50c4db8133671ce64dc1ae4
。从母版到新创建的git checkout master
的运动成为pu
,其评论为{ {1}}。)
分离HEAD@{1}
时,checkout: moving from master to pu
所做的工作是通过reflog为HEAD
生成根目录,以尝试找到在执行任何操作之前已明确检出的分支或标记。承诺你现在就在。如果您现在进行的HEAD分离提交与该分支或标记名的值匹配,则您为git status
,其中 Y 来自注释。如果您现在处于分离状态HEAD提交中,则不匹配(或者可能不是HEAD
),detached at Y
报告@{0}
而不是{{1 }}。
因此,如果您可以更新reflog,则可以获取git status
报告新内容。显而易见的方法是detached from Y
,但我尝试过。这是发生了什么事。首先,我们设置情况:
detached at Y
,当然还有git status
报告“在v2.18.0分离”。所以:
git update-ref
A,$ git checkout v2.18.0
[snip]
HEAD is now at 53f9a3e157 Git 2.18
$ git tag haha
$ git checkout haha
HEAD is now at 53f9a3e157 Git 2.18
$ git reflog | head -1
53f9a3e157 HEAD@{0}: checkout: moving from master to v2.18.0
也很捷径,没有费心去更新更新日志。 (也许git status
did 调用了reflog更新代码,但是那个却采用了快捷方式。)因此,现在该作弊了-请注意,我没有建议有人真正做到了!—通过知道HEAD reflog更新只会在$ git update-ref -m "moving from v2.18.0 to haha" HEAD HEAD
$ git reflog | head -1
53f9a3e157 HEAD@{0}: checkout: moving from master to v2.18.0
上添加一行:
git update-ref
git checkout haha
命令复制了最后一行;然后.git/logs/HEAD
用新注释替换了注释。因此,$ ed .git/logs/HEAD
16108
$t$
$s/from master to v2.18.0/from v2.18.0 to haha/
w
16281
q
$ git reflog | head -2
53f9a3e157 HEAD@{0}: checkout: moving from v2.18.0 to haha
53f9a3e157 HEAD@{1}: checkout: moving from master to v2.18.0
$ git status
HEAD detached at haha
nothing to commit, working tree clean
现在报告我们希望报告的内容。
$t$
显然是一个使更新程序短路的错误。它也可能是重要的或有用的优化,但如果是这样,则应基于被认为更重要的默认值,设置一些标志来启用优化或强制更新。除了整个 $s/from master to v2.18.0/from v2.18.0 to haha/
依赖于reflog 之外,该bug无关紧要。