如何签出从GitHub网站创建的git分支



所以我在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

这向我们展示了名为originupstream的遥控器。它们分别代表不同的Git存储库,您可以将连接到您的Git存储。

有时,你让你的Git在origin调用Git,看看他们有什么分支和提交。这些以origin/*的名称进入您的存储库——目前仅为origin/master,因为您已经告诉您的Git,所有其他分支都太无聊了,无法用语言表达。

其他时候,你让你的Git在upstream调用Git,看看他们有什么分支和提交。这些以upstream/*的名称进入您的存储库。

使用git fetch,您可以指示您的Git调用另一个Git。哪一个?好吧,这取决于:存储库中的每个分支都可以列出一个Git称为上游的东西。这个名字有点不幸,因为它也是你的一个遥控器的名字。但patch-10分支的上游通常是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/masterupstream/gh-pages:

git branch upmaster upstream/master
git checkout upmaster
git fetch

现在您的Git将从upstream(名为upstream的远程)获取,因为upmaster的上游是upstream/master,它使用upstream作为远程。(困惑了吗?如果没有,Git还有其他困惑的术语要用!😀说真的,这些历史事故把这里搞得一团糟。)

不管怎样,当只有一个远程(通常称为git clone --single-branch0)时,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-1git 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"的文档。