繁体   English   中英

“git 结帐<commit id> ”正在将分支更改为“无分支”

[英]“git checkout <commit id>” is changing branch to “no branch”

我正在 git 的一个分支上工作。 当我做

git checkout <commit id>

(从git log获得的提交 ID),它正在提交该特定更改,但分支更改为<No-branch>

为什么会这样? 你如何解决这个问题?

如果您直接checkout提交 sha,它会将您置于“分离头”状态,这基本上只是意味着您的工作副本已检出的当前 sha 没有指向它的分支。

如果您还没有进行任何提交,您可以通过在检查提交 sha 之前简单地检查您所在的任何分支来离开分离的头部状态:

git checkout <branch>

如果您确实在处于 detached head 状态时进行了提交,则可以通过在离开 detached head 状态之前或同时附加一个分支来保存您的工作:

# Checkout a new branch at current detached head state:
git checkout -b newBranch

您可以在官方 Linux Kernel Git docs for checkout 中阅读有关分离头状态的更多信息。

通过检查历史记录中的提交之一,您将 git 移动到所谓的“分离状态”,这看起来不是您想要的。 使用此单个命令在历史记录中的其中一个提交上创建一个新分支:

git checkout -b <new_branch_name> <SHA1>

如果你是分支master并且你做了一个git checkout <SHA>

我相当肯定这会导致 git 以分离状态加载该提交,从而将您从当前分支中移出。

如果您想进行更改,您可以,然后您可以执行git checkout -b <mynewbranch>以根据该提交和您所做的任何更改创建一个新分支。

那是在另一个分支中提交吗? 如果提交发生在另一个分支中,则Git checkout <commitid>只会切换到另一个分支。 如果您想要那里的代码,您将希望将更改合并到您的第一个分支。

其他答案已经解释了“分离头”的含义。 我试着回答我为什么要这样做。 在某些情况下,我更喜欢签出提交而不是签出临时分支。

  1. 为了在某​​些特定提交时编译/构建(可能是为了您的日常构建,或者只是为了向测试团队发布一些特定版本),我曾经为此签出一个 tmp 分支,但是我需要记住在构建后删除 tmp 分支。 所以我发现 checkout a commit 更方便,在构建之后我只是 checkout 到原始分支。

  2. 要检查该提交时的代码是什么样的,也许是为了调试问题。 这个案例与我的案例#1 没有太大不同,我也可以为此签出一个 tmp 分支,但我需要记住删除它。 所以我选择更频繁地检查提交。

  3. 这可能只是我偏执,所以我准备合并另一个分支,但我已经怀疑我会遇到一些合并冲突,我想在合并之前先看到它们。 所以我检查头部提交然后进行合并,查看合并结果。 然后我git checkout -f切换回我的分支,使用-f丢弃任何合并冲突。 我再次发现它比结帐 tmp 分支更方便。

考虑到提交 ID <commit_id_SHA1> ,当我想检查代码时,这对我来说效果最好

git fetch origin <commit_id_SHA1>
git checkout -b new_branch FETCH_HEAD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM