git:切换分支而不需要拆卸头


101

我在github上有一个存储库,其中有一个主要分支(master)和一个用于一些实验性工作的分支。我做了一些提交,并将其推送到实验分支,一切都很好。

现在,在另一台计算机上,我尝试克隆我的存储库(git clone repository),然后切换到实验分支(git checkout branchname),但是每次这样做,我的头就会分离,并且无法推送更改。我究竟做错了什么?我感觉到我在某个地方缺少基本的git概念,但是阅读随机的git手册页并没有给我任何线索。

我是git的新手,所以对不起,如果我是个白痴,但是我在文档中找不到任何可以帮助我重新确定头脑的东西。

编辑

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

谢谢您的帮助!


要使用Git 2.23(2019年8月)切换分支而不拆卸头部,git switch请使用:请参阅下面的我的答案
VonC

Answers:


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

# othertimes 
git checkout localname 

git push origin

为方便起见,您可以对本地名称和分支名称使用相同的字符串。
签出origin/branchname时,实际上并没有签出分支。 origin/branchname是一个“远程”名称,您可以使用

branch -a 

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

您必须首先在本地跟踪一个远程分支,以便能够切换到该分支并对其进行操作。


9
伙计,如果尚未跟踪分支,为什么“ git checkout origin / branchname”不会自动开始跟踪分支?
Martin Konicek 2010年

4
因为您仍然需要外国分支机构的本地名称。
肯特·弗雷德里克

这是我正在做的事情,以及错误消息:$ git checkout -b topic / fetch up / topic / fetch致命:git checkout:更新路径与切换分支不兼容。您是否打算检出无法解析为提交的“上游/主题/提取”?
ulu 2012年

2
感谢您提供有关颜色的提示。要启用颜色:git config --global --add color.ui true
PonyEars 2013年

1
值得注意的是,“来源/分支名称”实际上可以是任何可解析为SHA1或本身为SHA1的东西=)。我经常使用它来创建具有任意根的任意分支。
肯特·弗雷德里克

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

现在创建一个跟踪分支:

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

然后,在那里工作之后,只需通过

git push

3
git branch -t origin / experimental#不需要输入太多:)
Dustin

我要跟踪的分支称为主题/提取。当我尝试执行$ git branch --track topic / fetchupstream / topic / fetch时,它说是致命的:不是有效的对象名称:'upstream / topic / fetch'。
ulu 2012年

1
@Dustin,该命令创建一个本地分支“ origin / experimental”,以跟踪本地主机。我猜这是一个相当普遍的错误。
PDug

1
@PDug%git checkout -t origin / experimental分支实验设置用于通过重新基准化从源跟踪远程分支实验。切换到新的“实验”分支
Dustin

11

为了扩展肯特的回复,克隆后,您唯一拥有的分支(远程不计算在内)是您从中克隆的存储库中处于活动状态的分支(在您的情况下为master)。

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

$ git branch experimental origin/experimental

然后签出:

$ git checkout experimental

但是,Kent是正确的-这两个命令可以组合使用

$ git checkout -b experimental origin/experimental

3

在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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.