我正在使用git开发一个分支。当我做的时候
git checkout <commit id>
(从git log
获取的提交ID),它将被提交到该特定更改,但分支已更改为<No-branch>
。
为什么会这样?你是如何解决这个问题的?
答案 0 :(得分:32)
如果您checkout
直接提交sha,它会使您进入“分离头”状态,这基本上只意味着您的工作副本已检出的当前sha,没有指向的分支它
如果你还没有提交任何提交,你可以通过在签出提交之前检查你所在的任何一个分支来保持分离头状态:
git checkout <branch>
如果您在处于分离头状态时确实进行了提交,则可以在离开分离头状态之前或之时简单地附加分支来保存您的工作:
# Checkout a new branch at current detached head state:
git checkout -b newBranch
您可以阅读有关detached head state at the official Linux Kernel Git docs for checkout的更多信息。
答案 1 :(得分:27)
通过检查历史记录中的一个提交,您将git移动到所谓的“分离状态”,这看起来不是您想要的。使用此单个命令在历史记录的其中一个提交上创建新分支:
git checkout -b <new_branch_name> <SHA1>
答案 2 :(得分:2)
如果您是分支master
并且执行git checkout <SHA>
我很确定这会导致git在detached状态下加载该提交,从而使您退出当前分支。
如果您想进行更改,那么您可以执行git checkout -b <mynewbranch>
根据该提交创建新分支以及您所做的任何更改。
答案 3 :(得分:0)
那个提交在另一个分支中吗?如果在另一个分支中发生了提交,Git checkout <commitid>
将切换到另一个分支。如果您想在那里使用代码,则需要将更改合并到第一个分支。
答案 4 :(得分:0)
其他答案解释了“分离头”的含义。我试图回答为什么我要这样做。在某些情况下,我更喜欢检出提交而不是检出临时分支。
以某些特定的提交进行编译/构建(可能用于您的日常构建或 只是向测试团队发布一些特定版本),我曾经 为此签出一个tmp分支,但是我需要记住 构建后删除tmp分支。所以我发现结帐是 更加方便,在构建之后,我只是签出到原始分支。
要检查该提交的代码是什么样的,也许可以调试问题。这个案例与我的案例#1并没有太大的区别,我也可以为此签出一个tmp分支,但是然后我要记住删除它。因此,我选择更频繁地签出一次提交。
这可能只是我偏执,所以我准备合并另一个分支,但是我已经怀疑会遇到一些合并冲突,因此我想在合并之前先查看它们。所以我签出了头提交,然后进行合并,查看合并结果。然后,我git checkout -f
切换回分支,使用-f
放弃任何合并冲突。再次,我发现它比签出tmp分支更方便。
答案 5 :(得分:0)
鉴于提交 ID <commit_id_SHA1>
git fetch origin <commit_id_SHA1>
git checkout -b new_branch FETCH_HEAD