Git获取远程分支

Dav*_*vid 2088 git branch git-fetch git-branch

我的同事和我在同一个存储库上工作,我们已经将它分成两个分支,每个分支在技术上用于不同的项目,但是它们有相似之处,所以我们有时会想要master从... 返回到*branch.

但是,我有branch.我的问题是,我的同事怎么能专门拉那个分支?

一个git clone回购似乎并不在本地创建分支的他,虽然我可以在我结束推后住上unfuddle看到它们.

此外,当我最初创建分支时,我做了-b checkout.不确定这是否有很大的不同?

$ git branch -r
origin/HEAD -> origin/master
origin/daves_branch
origin/discover
origin/master

$ git fetch origin discover
$ git checkout discover
Run Code Online (Sandbox Code Playgroud)

这些是我跑的命令.但它绝对不起作用.

我希望能够检查该分支,然后推送并提交来自各个协作者或工作站的分支更改.

ral*_*nja 2829

您需要创建一个跟踪远程分支的本地分支.以下命令将创建一个名为daves_branch的本地分支,跟踪远程分支origin/daves_branch.推送更改时,将更新远程分支.

对于最新版本的git:

git checkout --track origin/daves_branch
Run Code Online (Sandbox Code Playgroud)

--track这是git checkout -b [branch] [remotename]/[branch][remotename] 在这种情况下起源的地方的简写,[branch]是两倍相同,在这种情况下是daves_branch.

对于git 1.5.6.5,你需要这个:

git checkout --track -b daves_branch origin/daves_branch
Run Code Online (Sandbox Code Playgroud)

对于git 1.7.2.3及更高版本,这已经足够了(可能已经提前开始,但这是我能够快速找到的最早确认):

git checkout daves_branch
Run Code Online (Sandbox Code Playgroud)

请注意,对于最近的git版本,此命令不会创建本地分支,并会使您处于"分离的HEAD"状态.如果需要本地分支,请使用该--track选项.详细信息请访问:http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches

  • "git fetch"以确保您的repo使用远程引用进行更新,"git checkout --track origin/discover"就足够了.然后你可以提交到那个分支和一个"git push"来同步你的更改遥控器. (122认同)
  • 看起来git 1.5.6.5需要这样:git checkout --track -b origin/daves_branch (42认同)
  • 这给我带来了麻烦,它创建了一个名为origin/<branch>的本地分支,现在对远程分支origin/<branch>不明确,我不知道如何摆脱疯狂的本地分支! (35认同)
  • 我试过这个并且"致命:git checkout:更新路径与切换分支不兼容.您是否打算签出'上游/开发'哪个无法解决为提交?".难道我做错了什么? (33认同)
  • 您需要显式添加本地分支名称,否则git会创建一个带有完整分支路径的新本地分支,如上面所述的@AlanMoore和@ derekmx271:`git checkout -b --track daves_branch origin/daves_branch` (24认同)
  • @NeilBarnwell我需要做一个`git fetch --all`(它取出所有的遥控器)来实现这一点. (11认同)
  • @MikeScott`git checkout --track -b daves_branch origin/daves_branch`,否则它告诉我_-- track不是有效的branch_. (8认同)
  • 这是否需要通过git fetch发现来进行? (7认同)
  • `fatal:无法同时更新路径并切换到分支'...'.您是否打算结帐"origin/..."无法解决为提交?`??? (3认同)
  • 我遇到了'警告:refname'origin/<branch>'是一个ambigious`.我的修复方法是运行`git checkout --track remotes/origin/<branch>` (3认同)
  • 如果本地不存在分支,您需要先执行 `git fetch`。 (3认同)
  • @NeilBarnwell阅读此答案[如何解决](http://stackoverflow.com/a/12320930/18788) (2认同)

Mar*_*ski 922

我用过fetch后跟checkout......

git fetch <remote> <rbranch>:<lbranch> 
git checkout <lbranch>
Run Code Online (Sandbox Code Playgroud)

... <rbranch>远程分支或源ref在哪里,并且<lbranch>是您想要跟踪的当前不存在的本地分支或目标引用,并且您可能希望将其命名为远程分支或源ref.这在解释的选项中解释<refspec>.

Git是如此的聪明就自动完成了第一个命令,如果我标签的远程分支的前几个字母之后.IE:我甚至不必命名本地分支,Git会自动为我复制远程分支的名称.谢谢Git!

此外,正如此类SO帖子的答案所示,如果您没有将本地分支命名为fetch,则在使用该-b标志检出时仍可以创建它.IE: git fetch <remote> <branch>后跟跟git checkout -b <branch> <remote>/<branch>我最初的答案完全一样.看样子,如果您的回购有只有一个遥控器,那么你可以这样做git checkout <branch>fetch,它会创建一个本地分支你.EG:您刚刚克隆了一个回购邮件,想要查看远程的其他分支.

我相信fetch可能已经逐字复制了一些文档pull.特别是在部分<refspec>选项是一样的.不过,我不相信fetch会不断merge,因此,如果您离开结肠目的地侧空fetch 应该什么都不做.

注意:这git fetch <remote> <refspec>是短的git fetch <remote> <refspec>:,因此无效,但git fetch <remote> <tag>与本地git fetch <remote> <tag>:<tag>复制远程的相同<tag>.

我想这只有在您想在本地复制远程分支时才有用,但不一定要立即检查.否则,我现在将使用上面接受的答案,这将在结账说明的第一部分和后面的选项部分中详细解释--track,因为它是一个1班轮.嗯...有点像1班轮,因为你仍然必须先跑git fetch <remote>.

仅供参考:(<refspecs>来源:目的地)的顺序解释了删除远程分支的奇怪的前Git-1.7方法.IE:不推送任何内容到目的地refspec.

  • 您假设Git自动完成已设置.http://code-worrier.com/blog/autocomplete-git/ (8认同)
  • Nit:git不执行自动完成,正是这样做的bash shell. (3认同)
  • 这对我来说很有效,可以将远程代码放入本地分支。但是,它没有让我的本地分支跟踪远程分支。 (2认同)
  • FWIW,我认为这个答案与接受的答案之间的区别在于,这个答案告诉您执行`fetch` 命令。不过,接受的答案是有道理的,因为 OP 指出他已经进行了提取。这至少是我遇到的问题。 (2认同)

pan*_*kka 355

如果您正在尝试"签出"新的远程分支(仅存在于远程分支,但不存在于本地),这就是您需要的:

git fetch origin
git checkout --track origin/<remote_branch_name>
Run Code Online (Sandbox Code Playgroud)

这假定您要从原点获取.如果没有,请用您的远程名称替换origin.

  • 从原点"拉"是令人困惑的语言,最好将上面的评论更改为从原点"获取".Pull是一个执行获取和合并的命令,这肯定会让新手感到困惑(包括我) (6认同)
  • 为我工作,我没有获取正确的远程分支,所以接受的答案对我来说一直失败,并显示出令人困惑的消息。+1 (2认同)

Dav*_*vid 117

检查远程存在而不是本地存在的myBranch - 这对我有用:

git fetch --all
git checkout myBranch
Run Code Online (Sandbox Code Playgroud)

我收到了这条消息:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案有误.我最初在没有`-t`的情况下完成了命令并得到了`你处于'超级HEAD'状态.您可以环顾四周,进行实验性更改并提交它们,并且您可以放弃在此状态下进行的任何提交,而不会通过执行另一次检出来影响任何分支.因为没有相同名称的本地分支.我不得不用`-t`重新运行来修复. (3认同)
  • 取决于 git 版本。最新版本,正如这里其他地方所说,只需要 git checkout &lt;name of branch on origin&gt;。小心同名本地 vs 远程分支 - 他们会把事情搞砸 (2认同)

Dan*_*Lee 51

使用git branch -a(本地和远程分支)或git branch -r(仅远程分支)查看所有远程及其分支.然后,您可以git checkout -t remotes/repo/branch对远程执行a 并创建本地分支.

还有一个git ls-remote命令可以查看该远程的所有引用和标记.

  • `git checkout -t remote_branch_name` 可能是所有答案中最简单、最懒的方法。 (4认同)
  • 是的,甚至可以签出远程仓库上的分支吗?显然(或者可能不是那么明显),首先会获取遥控器,以便您在本地拥有它们。git 书上有一个很好的章节:http://git-scm.com/book/en/Git-Branching-Remote-Branches (2认同)

Gui*_*ent 39

标题和问题混淆了:

  • Git获取远程分支
  • 我的同事怎么能专门拉那个分支呢.

如果问题是我如何使用远程分支或如何git checkout远程分支,更简单的解决方案是:

使用git(> = 1.6.6),您可以使用:

git checkout <branch_name>
Run Code Online (Sandbox Code Playgroud)

如果<branch_name>找不到本地但在一个具有匹配名称的遥控器中确实存在跟踪分支,则视为等效于:

git checkout -b <branch_name> --track <remote>/<branch_name>
Run Code Online (Sandbox Code Playgroud)

请参阅git checkout的文档

为你的朋友:

$ git checkout discover
Branch discover set up to track remote branch discover
Switched to a new branch 'discover'
Run Code Online (Sandbox Code Playgroud)


Man*_*d3r 29

git checkout -b serverfix origin/serverfix
Run Code Online (Sandbox Code Playgroud)

这是一个很常见的操作,git提供了--track简写:

git checkout --track origin/serverfix
Run Code Online (Sandbox Code Playgroud)

事实上,这种情况非常普遍,甚至还有一条捷径.如果您尝试签出的分支名称(a)不存在,并且(b)只与一个遥控器上的名称完全匹配,Git将为您创建跟踪分支:

git checkout serverfix
Run Code Online (Sandbox Code Playgroud)

要设置名称与远程分支不同的本地分支,可以轻松地使用具有不同本地分支名称的第一个版本:

git checkout -b sf origin/serverfix
Run Code Online (Sandbox Code Playgroud)

现在,您的本地分支sf将自动从origin/serverfix中提取.

资料来源:Pro Git第2版,由Scott Chacon和Ben Straub撰写(为便于阅读)


Jam*_*run 29

最简单的方法,至少对我来说:

git fetch origin <branchName> // will fetch the branch locally
git checkout <branchName> // to move to that branch
Run Code Online (Sandbox Code Playgroud)

  • 不带其他分行 (4认同)
  • @BenjaminHarel问题说"获取远程分支"并非所有分支.为此,这可能对您有所帮助/sf/ask/721876501/ (4认同)
  • 使用此“ fetch”命令后,所需的分支将在本地计算机上可用。需要使用git checkout -b'your_branch'origin /'remote branch'来签出该分支。 (2认同)

Jav*_* C. 26

[快速回答]

有很多选择,我最喜欢的是:

- 备选方案 1:

git fetch --all
git checkout YourBranch
Run Code Online (Sandbox Code Playgroud)

使用远程存在但不在本地的分支使用此替代方法。

- 备选方案 2:

git checkout -b 'YourBranch' origin/'YourRemote'
Run Code Online (Sandbox Code Playgroud)

大概,这是最简单的方法。


Kar*_*ara 23

使用这个简单的命令:

git checkout -b 'your_branch' origin/'remote branch'
Run Code Online (Sandbox Code Playgroud)


ata*_*min 15

是什么帮助了我

1)查看所有可用的远程分支(例如'remote-branch-name')

git branch -r
Run Code Online (Sandbox Code Playgroud)

2)使用远程分支名称创建本地分支

git fetch && git checkout 'remote-branch-name'
Run Code Online (Sandbox Code Playgroud)


小智 14

git fetch

git branch -r

git checkout <branch_name>
Run Code Online (Sandbox Code Playgroud)


Kum*_*hav 14

您也可以一次性获取和签出远程分支: -

git fetch && git checkout the-branch-name
Run Code Online (Sandbox Code Playgroud)


Gui*_*ume 13

我打字了

git checkout <branch_name>
Run Code Online (Sandbox Code Playgroud)

得到了

Branch <branch_name> set up to track remote branch <branch_name> from origin.
Switched to a new branch '<branch_name>'
Run Code Online (Sandbox Code Playgroud)


Har*_*wal 13

要获取远程存在的分支,最简单的方法是:

git fetch origin branchName
git checkout branchName
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令查看它是否已经存在于远程服务器上:

git branch -r
Run Code Online (Sandbox Code Playgroud)

这将获取远程分支到您的本地,并将自动跟踪远程分支。

  • 这个问题怎么没有更多的赞成票?我可能是错的,但这似乎确实奏效了,从远程获取了一个我在本地没有的分支...... (2认同)

Sam*_*Sam 11

步骤如下;

  1. git fetch origin或者git fetch --all,这会将所有远程分支提取到您的本地,然后这是您可以继续使用的第二个选项。

  2. git checkout --track origin/<The_remote_branch you want to switch over>

然后在此分支上工作,您可以通过键入来验证您是否在该分支上

git branch
Run Code Online (Sandbox Code Playgroud)

它显示您当前所在的分支。


小智 11

有时你会被要求不要使用主分支并且只使用远程分支(正如我被要求的那样).所以你需要的只是远程分支.

因此,要单独克隆远程分支(没有主服务器),请执行此操作

git clone url --branch remote_branch_name
Run Code Online (Sandbox Code Playgroud)

其中,remote_branch_name是远程分支的名称

例如,

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --branch v3.15
Run Code Online (Sandbox Code Playgroud)

这将确保使用远程分支的名称将远程分支克隆到本地分支.

现在,如果您提交代码并推送,代码将单独提交给该分支.


Vam*_*ram 10

检查您的文件,特别是在获取该远程文件.git/config时存在哪些跟踪。

[remote "randomRemote"]
    url = git@github.com:someUser/someRepo.git
    fetch = +refs/heads/*:refs/remotes/randomRemote/*
Run Code Online (Sandbox Code Playgroud)

如果它有heads/*指向randomRemote/*,当你运行时git fetch randomRemote,它将获取所有分支。

然后你就可以签出该分支。

否则,

  1. 您需要使用它来将远程分支添加到跟踪中。.git/config运行后检查你的。你会明白的。

    git remote set-branches --add randomRemote randomBranch
    
    Run Code Online (Sandbox Code Playgroud)
  2. 跑步git fetch randomRemote。这将获取远程分支。

  3. 现在你可以运行了git checkout randomBranch


Jer*_*ony 8

git fetch --all & git checkout <branch name>


zaf*_*003 8

假设您的遥控器是git@xyz.git,并且您想要它的random_branch分支。该过程应如下:

  1. 首先通过以下方式查看您的遥控器列表

    git remote -v

  2. 如果在上述命令的输出中没有git@xyz.git远程,则可以通过以下方式添加它:

    git remote add xyz git@xyz.git

  3. 现在,您可以通过以下方式获取该遥控器的内容

    git fetch xyz

  4. 现在,通过以下方式检出该遥控器的分支

    git checkout -b my_copy_random_branch xyz/random_branch

  5. 通过以下方式查看分支列表

    git branch -a

本地分支my_copy_random_branch将跟踪您的遥控器的random_branch分支。


Col*_*n D 7

如果您有一个被克隆的存储库,--depth 1那么列出的许多命令将不起作用。例如,请参见此处

% git clone --depth 1 https://github.com/repo/code
Cloning into 'code'...
cd code
remote: Counting objects: 1778, done.
remote: Compressing objects: 100% (1105/1105), done.
remote: Total 1778 (delta 87), reused 1390 (delta 58), pack-reused 0
Receiving objects: 100% (1778/1778), 5.54 MiB | 4.33 MiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Checking out files: 100% (1215/1215), done.
% cd code
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
% git fetch origin other_branch
remote: Counting objects: 47289, done.
remote: Compressing objects: 100% (15906/15906), done.
remote: Total 47289 (delta 30151), reused 46699 (delta 29570), pack-reused 0
Receiving objects: 100% (47289/47289), 31.03 MiB | 5.70 MiB/s, done.
Resolving deltas: 100% (30151/30151), completed with 362 local objects.
From https://github.com/repo/code
 * branch            other_branch-> FETCH_HEAD
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
%
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我会重新克隆存储库,但也许还有其他技术,例如git浅克隆 (clone --depth) 错过远程分支


tam*_*koo 7

git fetch && git checkout <your friend's branch name> 应该做的伎俩


Riz*_*izo 6

只需尝试

$ git pull origin your_branch_name

  • 问题在于它会尝试将该远程分支与您的 CURRENT 分支合并,该分支不是远程分支(因为这对您的本地存储库来说是新的) (3认同)
  • Rizo,git pull origin branch_name应该是最好的解决方案。您是唯一将此发布为解决方案的人,它对我有用。这行得通,因为它将使用master分支更新您的分支。简单而简单。 (2认同)

Har*_*hil 6

我想给您一个oneliner命令,以将所有远程分支提取到您的本地并切换到所需的新创建的本地分支:

git fetch && git checkout discover
Run Code Online (Sandbox Code Playgroud)

运行以上命令后,您将获得以下消息:

Switched to a new branch 'discover'
Branch discover set up to track remote branch discover from origin.
Run Code Online (Sandbox Code Playgroud)

第一行指出切换到 新分支 -为什么要新?它已经在远程!

但是实际上您也必须在本地创建它,该分支从远程索引中获取并为您本地创建。

discover是从存储库的远程分支创建的新分支discover

但是第二行比第一提供了更多信息,告诉我们:

我们的分支设置为跟踪具有相同名称的远程分支

虽然将git fetch 所有分支都提取到本地,但是如果您在git branch其后运行,则只会看到master本地的分支为什么

因为对于远程的每个分支,您也必须在本地创建它,以便像git checkout <branchname>上面的示例中那样跟踪它。

运行git checkout命令后,您git branch现在可以运行,您可以看到两个分支:

  1. 大师和2.在您的本地列表中发现。


Ish*_*nal 5

如果您想获取所有远程分支,请输入

git fetch --all
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助其他人查看所有远程分支。