Git:切换分支而不使HEAD分离

110

我在Github上有一个主分支(master)和一个用于实验性工作的分支。我进行了一些提交并将它们推送到了实验性分支,一切都很好。

现在,在另一台机器上,我尝试克隆我的存储库(git clone repository),然后切换到实验性分支(git checkout branchname),但每次这样做时我的head会被分离并且我不能推送我的更改。我做错了什么?我感觉我缺少了一些基本的git概念,但阅读随意的git手册并没有给我任何线索。

我是git新手,所以如果我像个白痴一样,我很抱歉,但我找不到任何可以帮助我重新连接head的文档。

编辑

我缺乏的概念是跟踪分支。现在我理解了这个概念,一切都变得清晰了。就我个人而言,我发现git branch --track语法比git checkout -b branch-name origin/branch-name要直观得多。

感谢您的帮助!


使用Git 2.23(2019年8月)中的**git switch**,可以在不分离HEAD的情况下切换分支:请参见我的下面的答案 - VonC
4个回答

124
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin
为了方便起见,您可以使用相同的字符串作为localname和branchname。当您检出 origin/branchname 时,您并没有真正检出一个分支。 origin/branchname 是一个“远程”名称,您可以使用以下命令获取它们的列表:
branch -a 

如果启用了颜色,本地分支将显示为一种颜色,远程分支则显示为另一种颜色。

您必须先将远程分支跟踪到本地才能切换并在其上工作。


9
为什么如果还没有跟踪分支,"git checkout origin/branchname"不能自动开始跟踪该分支呢? - Martin Konicek
4
因为您仍需要为外国分支机构取一个当地的名称。 - Kent Fredric
这是我正在做的事情,以及错误信息: $ git checkout -b topic/fetch upstream/topic/fetch 致命错误:git checkout:更新路径与切换分支不兼容。 您是否打算检出“upstream/topic/fetch”,但无法解析为提交? - ulu
2
感谢关于颜色的提示。要启用颜色:git config --global --add color.ui true - PonyEars
@KentFredric 大多数情况下,分支会自动跟踪。我克隆了一个有很多分支的仓库,在没有跟踪的情况下检查它们对于所有分支都有效,除了一个特定的分支使我进入了分离状态。然而,这个命令解决了问题,非常感谢您。 - Fermin Silva
1
值得注意的是,“origin/branchname”可以是任何解析为SHA1或SHA1本身的内容。我经常使用它来创建具有任意根的任意分支。 - Kent Fredric

19
git clone git@github.com:abc/def.git
cd def

现在创建一个跟踪分支:

git branch --track experimental origin/experimental
git checkout experimental

然后,在那里工作后,只需通过Github进行推送

git push

3
git branch -t origin/experimental # 不需要输入那么多字 :) 翻译:这条命令用于在本地创建名为"experimental"的分支,并将其与远程分支"origin/experimental"关联起来。提示中的建议是指可以使用"-t"选项来简化输入。 - Dustin
我想追踪的分支名叫做topic/fetch。当我尝试执行 $ git branch --track topic/fetch upstream/topic/fetch 它会显示: 致命错误:'upstream/topic/fetch' 不是一个有效的对象名称。 - ulu
1
@Dustin,该命令创建一个名为“origin/experimental”的本地分支,用于跟踪本地主分支。我猜这是一个相当常见的错误。 - PDug
1
@PDug%git checkout -t origin/experimental 分支实验设置为跟踪原点的远程分支实验并进行变基。 切换到新分支“ 实验”。 - Dustin

11

在Kent的回答上进行补充,当你克隆完之后,唯一存在的分支(远程分支不算)就是从中克隆的仓库中当前处于活动状态的分支——在你的情况下是主分支master。

因此,首先你需要创建一个新的分支来追踪远程实验分支:

$ git branch experimental origin/experimental

然后检查它:

$ git checkout experimental

然而,肯特是正确的 - 这两个命令可以合并

$ git checkout -b experimental origin/experimental

9

使用Git 2.23(2019年8月),您将使用git switch命令

如果您有一个同名的远程分支,它将被自动跟踪:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接