Git-在标签之间切换

时间:2018-11-18 19:56:34

标签: git tags vcs-checkout

当我尝试在同一提交中签出其他标签时遇到问题。

这在我检查分离头在哪里的应用程序中成为一个问题。

我认为这是因为提交同时被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.1-> 4.1更新

4.1.1 -> 4.1

在最后一次检出中,我无法从4.1切换到4.1.1,可能是因为HEAD已经在提交中,是否有某种方式强制“ HEAD分离为N”,而不像在这种情况下检出master分支,并且然后检查标签。

由于应该在生产中使用此功能,因为此时可能会有一些在线用户,所以我希望结帐尽可能平滑且 clear (分离头部)。

1 个答案:

答案 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无关紧要。