41

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

git checkout <commit id>

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

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

4

6 回答 6

53

如果您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 文档中阅读更多关于分离头状态的信息。

于 2013-08-05T08:58:24.793 回答
51

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

git checkout -b <new_branch_name> <SHA1>
于 2013-08-05T09:05:17.103 回答
3

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

于 2013-08-05T08:57:37.737 回答
3

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

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

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

于 2013-08-05T08:57:39.547 回答
0

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

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

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

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

于 2020-04-03T03:15:35.123 回答
0

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

git fetch origin <commit_id_SHA1>
git checkout -b new_branch FETCH_HEAD
于 2021-02-13T09:02:36.600 回答