gpt4 book ai didi

git checkout refs/heads/master 分离 HEAD

转载 作者:太空狗 更新时间:2023-10-29 14:19:09 25 4
gpt4 key购买 nike

我有一个本地分支“master”跟踪一个远程分支“origin/master”。

当我这样 checkout 时:

git checkout refs/heads/master

我最终得到了一个独立的 HEAD:

Note: checking out 'refs/heads/master'.

You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.

显然我可以只检查“master”,但这恰好是一个模棱两可的引用。我只想知道在不分离 HEAD 的情况下消除分支名称歧义的“git 方式”是什么。

最佳答案

git checkout 的文档没有说明当 master 不明确时它的行为方式。查看源代码(我浏览得很快,所以我可能错了),看起来 git checkout 假设提供的名称(例如 master )是一个分支名称,直到它发现 refs/heads/* 中没有给定名称的引用。

因此,当修订不明确时检查分支的正确方法是省略 refs/heads/,例如 git checkout master

分支与修订

请注意,指定分支 和指定修订(或其他对象)之间存在细微但重要的区别。对于采用修订(或一般对象)的命令和选项,指定 master 与指定 refs/heads/master 相同,除非 master 不明确。它也与指定 master^0master 指向的 SHA1 等相同。

对于采用分支的命令和选项(例如 git branch--branches 等命令的 git log 选项),指定 master 与指定 refs/heads/master 不同。在这些情况下,完整的字符串 refs/heads/master 被解释为分支的名称,导致 Git 创建/检查/更新名为 refs/heads/refs/heads/master 而不是 refs/heads/master 的引用。

git checkout 命令用途广泛,很方便,但在 masterrefs/heads/master 等情况下可能会造成混淆。当您指定 master 并且存在名为 refs/heads/master 的引用时,git checkout 假定您指的是 master 分支,而不是 master 指向的修订版。当您指定 refs/heads/master 并且名为 refs/heads/refs/heads/master 的引用不存在时,则 git checkout 假定您指的是 master 指向的修订版,而不是名为 refs/heads/master 的分支(因此您得到一个分离的 HEAD )。

有歧义时检查非分支

如果你想查看其他一些短名称也是 master 的 ref(例如名为 master 的标签),你必须拼出完整的 ref 名称(例如 git checkout refs/tags/master )或以这样的方式拼写修订版不能解释为有效的分支名称(例如 git checkout master^0 )。后者导致 git checkout 遵循 git help revisions 中描述的消歧规则:

When ambiguous, a <refname> is disambiguated by taking the first match in the following rules:

  1. If $GIT_DIR/<refname> exists, that is what you mean (this is usually useful only for HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD and CHERRY_PICK_HEAD);
  2. otherwise, refs/<refname> if it exists;
  3. otherwise, refs/tags/<refname> if it exists;
  4. otherwise, refs/heads/<refname> if it exists;
  5. otherwise, refs/remotes/<refname> if it exists;
  6. otherwise, refs/remotes/<refname>/HEAD if it exists.

当然,结果将是分离的 HEAD ,但当您 checkout 非分支时,这种情况总是会发生。

关于git checkout refs/heads/master 分离 HEAD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com