所以我在GitHub repo上创建了一个快速更改,但它需要更多的工作,添加单元测试和运行构建。因此,我创建了一个新的分支与网络接口:
https://github.com/jcubic/prism/tree/patch-1
但当我使用git pull
时,在终端中,我没有任何更改。当我使用git branch -a
时,我得到了:
$ git branch -a
* master
scheme-operators
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/upstream/gh-pages
remotes/upstream/master
没有分支CCD_ 3。我在.git/config:中有这个
[remote "origin"]
url = git@github.com:jcubic/prism.git
fetch = +refs/heads/master:refs/remotes/origin/master
我如何用GitHub上的东西更新我的本地回购?
编辑:
这可能是GitHub方面的一个错误。这是报道,我正在等待答复。
这:
[remote "origin"] url = git@github.com:jcubic/prism.git fetch = +refs/heads/master:refs/remotes/origin/master
就是问题所在。注意此处的fetch
行;这是使用CCD_ 5或其几个等价物之一的结果。
制作了一个要成为多分支克隆的单分支克隆后,建议使用git remote
更新要获取的分支集。我个人更喜欢只运行git config --edit
并使用我的编辑器,但是:
git remote set-branches origin "*"
将起作用,并避免git config --edit
可能出现的一些陷阱。
你真正的目标是让这三行读起来:
[remote "origin"]
url = git@github.com:jcubic/prism.git
fetch = +refs/heads/*:refs/remotes/origin/*
注意第三行的变化:我们现在让我们的(本地)Git(我们的Git软件,在这个存储库上运行)像往常一样调用他们的Git,但这一次,当他们的Git(他们的存储库上的软件)列出他们的所有分支时,我们的Git说";对我会拿走所有的"只列出了master
,我们的Git会选择它们的分支:哦,嗯,补丁-1,这不有趣"特征";,不,传球"fix-23";?不可能"master":啊,那是我们唯一关心的:是的,求你了
当我们的Git说不想要除了master
之外的任何分支时,他们只向发送我们制作origin/master
所需的片段——我们对其master
的记忆——而不是我们制作自己的origin/patch-1
所需的任何片段。因此,通过显式拒绝他们的patch-1
,您永远不会得到origin/patch-1
,因此无法从他们的patch-1
创建自己的patch-1
。
撤消单个分支ness修复了所有,现在:
git fetch origin
从中获取其分支的所有,将它们转换为您的所有远程跟踪名称origin/*
。
关于git fetch --all
hreikin的回答提到了git fetch --all
(和git fetch --multiple
;还有其他变体)。当您有多个远程时,这些有时很有用。
远程是一个名称和URL集,事实上您有不止一个远程:
$ git branch -a * master scheme-operators remotes/origin/HEAD -> origin/master remotes/origin/master remotes/upstream/gh-pages remotes/upstream/master
这向我们展示了名为origin
和upstream
的遥控器。它们分别代表不同的Git存储库,您可以将连接到您的Git存储。
有时,你让你的Git在origin
调用Git,看看他们有什么分支和提交。这些以origin/*
的名称进入您的存储库——目前仅为origin/master
,因为您已经告诉您的Git,所有其他分支都太无聊了,无法用语言表达。
其他时候,你让你的Git在upstream
调用Git,看看他们有什么分支和提交。这些以upstream/*
的名称进入您的存储库。
使用git fetch
,您可以指示您的Git调用另一个Git。哪一个?好吧,这取决于:存储库中的每个分支都可以列出一个Git称为上游的东西。这个名字有点不幸,因为它也是你的一个遥控器的名字。但patch-1
0分支的上游通常是origin/master
:Git上分支master
的远程跟踪名称,您称之为origin
。
运行git fetch
时,默认情况是调用Git,该Git包含当前分支用作其远程跟踪名称的分支。因此,如果你在master
上,并且它的上游设置为origin/master
,那么当你运行git fetch
时,你的Git将运行git fetch origin
,而不命名要从获取的Git。
但是,如果您运行git fetch upstream
,您的Git将从upstream
而不是origin
获取。或者,您可以创建一些其他分支,其上游设置为upstream/master
或upstream/gh-pages
:
git branch upmaster upstream/master
git checkout upmaster
git fetch
现在您的Git将从upstream
(名为upstream
的远程)获取,因为upmaster
的上游是upstream/master
,它使用upstream
作为远程。(困惑了吗?如果没有,Git还有其他困惑的术语要用!😀说真的,这些历史事故把这里搞得一团糟。)
不管怎样,当只有一个远程(通常称为git clone --single-branch
0)时,git fetch
从一个远程获取这一特殊功能非常有效。但一旦你有两个或更多,能够从中提取所有是很好的。
这就是--all
标志的作用这意味着获取所有遥控器。这并不意味着获取所有分支:获取的分支是每个远程的,由fetch =
行指定1但在实践中,使用git fetch --all
没有多大意义,因为还有另一个命令:
git remote update
这意味着获取所有。git remote
命令具有更多的调谐选项;组";例如,从最常用的遥控器获取。这些可以都由git fetch
完成,但git remote
是真正针对这种精细细节的命令。
底线是:
- 使用
git fetch
从远程获取this分支 - 如果您有多个遥控器,请使用
git remote update
从所有遥控器中提取
有了这些作为一般规则,以及上游和fetch =
行如何工作的知识,您现在已经做好了准备。
1从技术上讲,每个遥控器可以有多条线路。您也可以使用命令行上的refspec覆盖这些行。
您需要首先使用git fetch
这将从GitHub下载所有分支及其提交历史记录(请注意,git pull
也运行git fetch
,但也是一个git merge
)。
在运行git fetch
之后,您可以看到带有git branch -a
的远程分支。
然后,您可以使用git checkout patch-1
或git checkout -b patch-1 remotes/origin/patch-1
进行检查。
您需要首先从远程获取分支。
- 要从本地跟踪的远程获取所有分支,可以运行
git fetch --all
- 要从特定的远程获取,在本例中为原点,请运行
git fetch origin
- 要从多个远程获取,在本例中为原点和上游,请运行
git fetch --multiple origin upstream
- 然后运行
git branch -a
查看所有分支 - 然后要签出分支,请运行
git checkout nameofnewbranch
此处提供了"git fetch"的文档。