git checkout默认情况下不创建本地分支和跟踪远程

时间:2017-05-03 14:27:02

标签: git

我正在克隆一个网站回购。远程主机相当有限;我不能成为回购的分支。

当我克隆回购时,原点被设置为远程主机mysite@mysite.acquia.com。当我执行git checkout {branch name}时,新的本地分支会自动跟踪远程

因为我不想在远程仓库上放置一堆开发分支,所以我用git remote rm origin删除了原点。然后,我根据内部共享驱动器上的origin repo制作了一个名为bare的新遥控器:git remote add origin file:///h/path-to-repo。 (这个遥控器已经有我的开发分支)。

然后,因为我最终想要将我的开发分支推送到公共远程仓库,所以我添加了原始来源,这次称之为acquiagit remote add acquia mysite@mysite.acquia.com

所以现在我的遥控器看起来像这样:

$ git remote -vv
acquia mysite@mysite.acquia.com
origin file:///h/path-to-repo

但是,当我从任一远程签出分支时,默认行为不再是创建跟踪远程的同名的新本地分支。相反,我处于无头状态:

$ git checkout origin/2017-04-11_social-media-footer
Note: checking out 'origin/2017-04-11_social-media-footer'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 8fe45a25... Pinned social media view at 3 columns

$ git branch -a
* (HEAD detached at origin/2017-04-11_social-media-footer)
  Sprint-04282017
  remotes/acquia/2017-03-30_feature-a
  remotes/acquia/2017-03-31_feature-b
  ... 
  remotes/acquia/2017-04-11_social-media-footer
  ...

当然,我可以创建一个与远程分支名称匹配的新本地分支,并将其设置为跟踪远程分支,但我已经习惯了这种情况。在我改变遥控器之前,发生了什么。

当我签出远程分支时,如何让我的git repo自动分支和跟踪遥控器?

我在Windows 7上的git-bash上使用git版本2.12.0.windows.1。

编辑我做了一个普通的克隆,没有改变遥控器,来测试我的感觉是预期的行为

$ git clone mysite@mysite.acquia.com
Cloning into 'mysite'...
remote: Counting objects: 19980, done.
remote: Compressing objects: 100% (16606/16606), done.
remote: Total 19980 (delta 6440), reused 15091 (delta 2786)
Receiving objects: 100% (19980/19980), 49.65 MiB | 176.00 KiB/s, done.
Resolving deltas: 100% (6440/6440), done.
Checking out files: 100% (12066/12066), done.

$ cd mysite; git branch
* master

$ git checkout 2017-04-05_memcache
Checking out files: 100% (210/210), done.
Switched to a new branch '2017-04-05_memcache'
Branch 2017-04-05_memcache set up to track remote branch 2017-04-05_memcache from origin.

$ git branch
* 2017-04-05_memcache
  master

# what is this branch tracking?
$ git  rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/2017-04-05_memcache

因此,默认情况下,当我克隆远程仓库时,检出远程分支会创建一个同名的本地分支,并将其设置为跟踪远程。这是我以前在所有工作场所和家中所使用的行为。我在这里做了什么来改变这种默认行为?

2 个答案:

答案 0 :(得分:4)

为什么它不起作用:快捷方式有太多的选择

基本问题归结为the git checkout documentation中的这一句:

  

如果&lt; branch&gt;找不到但在 正好一个 远程(称为&lt; remote&gt;)中存在跟踪分支,其名称匹配,视为等效于

$ git checkout -b <branch> --track <remote>/<branch>

(强调我的)。

假设您只有一个遥控器,并输入命令:

git checkout 2017-04-05_memcache

Git发现还没有2017-04-05_memcache,检查所有遥控器,找到匹配的origin/2017-04-05_memcache,然后做引用的事情。

假设您现在有两个遥控器,originacquia,并输入相同的命令。如果只有一个遥控器有origin/2017-04-05_memcacheacquia/2017-04-05_memcache,那么它只会起作用。但是如果两个都有相应的远程跟踪分支,Git就不知道使用哪个。它抛出了它的隐喻之手,让你输入更长的命令。

漫长的路和另一个不同的快捷方式

就个人而言,我可能只需输入git checkout -b 2017-04-05_memcache <remote>/2017-04-05_memcache。但是,在相同的文档中,我们看到:

  

- 轨道

     
    创建新分支时,请设置“上游”配置。有关详细信息,请参阅git-branch(1)中的“--track”。
     
    如果没有给出-b选项,则通过查看为相应远程配置的refspec的本地部分,然后剥离初始分支,将从远程跟踪分支派生新分支的名称部分到“*”。这将告诉我们在分支“origin / hack”(或“remotes / origin / hack”,甚至“refs / remotes / origin / hack”)时使用“hack”作为本地分支。如果给定名称没有斜杠,或者上面的猜测结果为空名称,则中止猜测。在这种情况下,您可以使用-b明确指定名称。

因此,您可以输入:

git checkout -t origin/2017-04-11_social-media-footer

而不是:

git checkout -b 2017-04-05_memcache origin/2017-04-05_memcache

并获得相同的效果:您指定远程跟踪分支名称(可让您选择您想要的远程 -t或{ {1}}选项,Git猜测本地分支名称来创建,而不是通常的方法来指定本地名称,让Git猜测你的远程跟踪分支是哪个。

答案 1 :(得分:1)

git checkout -t origin/branchname应该诀窍。

从手册:

       -t, --track
           When creating a new branch, set up "upstream" configuration. See "--track" in git-
           branch(1) for details.