我正在克隆一个网站存储库。远程主机相当有限;我无法拨回仓库。
克隆存储库时,源设置为远程主机mysite@mysite.acquia.com。当我这样做时git checkout {branch name},新的本地分支会自动跟踪远程
因为我不想在远程仓库上放一堆开发分支,所以我用删除了源git remote rm origin。然后,我origin基于bare内部共享驱动器上的存储库制作了一个新的远程服务器git remote add origin file:///h/path-to-repo。(此遥控器已经具有我的开发分支)。
然后,因为最终我希望将开发分支推送到通用远程仓库,所以我又添加了原始源,这次称为acquia:git remote add acquia mysite@mysite.acquia.com。
所以现在我的遥控器看起来像这样:
$ git remote -vv
acquia mysite@mysite.acquia.com
origin file:///h/path-to-repo
Run Code Online (Sandbox Code Playgroud)
但是,当我从任一远程签出分支时,默认行为不再是创建具有相同名称的新本地分支来跟踪远程。相反,我处于无头状态:
$ 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
...
Run Code Online (Sandbox Code Playgroud)
当然,我可以创建一个与远程分支名称匹配的新本地分支,并将其设置为跟踪远程分支,但是我习惯于这种情况会自动发生。就是这样,在我更换遥控器之前。
当我签出远程分支时,如何让我的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
Run Code Online (Sandbox Code Playgroud)
因此,默认情况下,当我克隆远程存储库时,签出远程站点上的分支会创建一个具有相同名称的本地分支,并将其设置为跟踪远程站点。这是我在所有工作场所和家里都习惯的行为。我在这里做了什么更改此默认行为?
基本问题归结为git checkout文档中的这一句话:
如果未找到<branch>,但确实在一个具有匹配名称的远程站点(称为<remote>)中存在跟踪分支,则将其等同于
Run Code Online (Sandbox Code Playgroud)$ git checkout -b <branch> --track <remote>/<branch>
(强调我的)。
假设您只有一个遥控器,然后输入以下命令:
git checkout 2017-04-05_memcache
Run Code Online (Sandbox Code Playgroud)
Git发现还没有2017-04-05_memcache,检查所有的遥控器,找到唯一的匹配项origin/2017-04-05_memcache,然后执行引用的操作。
假设您现在有两个遥控器origin和acquia,并输入相同的命令。如果只有一个遥控器具有origin/2017-04-05_memcache或acquia/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
Run Code Online (Sandbox Code Playgroud)
而不是:
git checkout -b 2017-04-05_memcache origin/2017-04-05_memcache
Run Code Online (Sandbox Code Playgroud)
并获得同样的效果:您指定的远程跟踪分支名(它可以让你选择远程哪个你想)和中-t或--track选项,并在Git的猜测本地分支名创建,而不是specfying本地名的常用方法然后让Git猜测您的意思是哪个远程跟踪分支。