Git获取远程分支

时间:2012-03-02 17:06:57

标签: git branch git-branch git-fetch

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

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

回购邮件的git clone似乎并没有在本地为他创建分支,但是我可以看到他们在我推动结束后生活在一起。

另外,当我最初创建分支时,我做了-b checkout 不确定这是否会产生太大影响?

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

$ git fetch origin discover
$ git checkout discover

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

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

31 个答案:

答案 0 :(得分:2591)

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

对于最新版本的git:

git checkout --track origin/daves_branch

--trackgit checkout -b [branch] [remotename]/[branch]的简写,其中[remotename] origin 在这种情况下,[branch]是两倍相同的, daves_branch in这种情况。

对于git 1.5.6.5,你需要这个:

git checkout --track -b daves_branch origin/daves_branch

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

git checkout daves_branch

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

答案 1 :(得分:843)

我使用fetch后跟checkout ...

git fetch <remote> <rbranch>:<lbranch> 
git checkout <lbranch>

...其中<rbranch>是远程分支或源参考<lbranch>是尚未不存在的本地分支或<要跟踪的em> destination ref 以及您可能希望将其命名为远程分支或源ref的名称。这在[{1}}的解释中options下解释。

Git非常聪明,如果我在远程分支的前几个字母之后 tab ,它会自动完成第一个命令。 IE:我甚至不必命名本地分支,Git会自动为我复制远程分支的名称。谢谢Git!

同样如the answer in this similar SO post所示,如果您没有在<refspec>中命名本地分支,则在使用fetch标志检出时仍可以创建它。 IE: -b后跟git fetch <remote> <branch>与我的初始答案完全相同。显然,如果您的repo只有一个遥控器,那么您可以在git checkout -b <branch> <remote>/<branch>后执行git checkout <branch>,它将为您创建一个本地分支。 EG:您刚刚克隆了一个回购邮件,想要查看远程的其他分支。

我认为fetch的部分文档可能已从pull逐字复制。特别是optionsfetch的部分是相同的。但是,我认为<refspec>永远不会merge,所以如果您将冒号的目的地一侧留空fetch 则无效

注意:fetch git fetch <remote> <refspec>git fetch <remote> <refspec>:的缩写,因此不会执行任何操作,但git fetch <remote> <tag>git fetch <remote> <tag>:<tag>相同,后者应复制远程<tag>本地。

我想这只有在您想在本地复制远程分支时才有用,但不一定要立即检查。否则,我现在会使用the accepted answer abovecheckout description的第一部分以及--track部分git fetch <remote>部分详细解释,因为它是{ 1衬。 嗯...... 有点像1班轮,因为你仍然必须先运行<refspecs>

仅供参考:{{1}}(来源:目的地)的顺序解释了options的奇怪的前Git-1.7方法。 IE:不向目标refspec推送任何内容。

答案 2 :(得分:322)

如果您正在尝试“结帐”新的远程分支(仅存在于远程分支上,但不存在于本地),这就是您需要的内容:

git fetch origin
git checkout --track origin/<remote_branch_name>

这假设您要从 origin 获取。如果没有,请用远程名称替换 origin

答案 3 :(得分:103)

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

git fetch --all
git checkout myBranch

我收到了这条消息:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'

答案 4 :(得分:46)

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

还有一个git ls-remote命令可以查看该遥控器的所有引用和标签。

答案 5 :(得分:37)

标题和问题混淆不清:

  • Git fetch remote branch
  • 我的同事怎么能专门拉那个分支。

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

使用git(&gt; = 1.6.6),您可以使用:

git checkout <branch_name>

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

git checkout -b <branch_name> --track <remote>/<branch_name>

see documentation for git checkout

为你的朋友:

$ git checkout discover
Branch discover set up to track remote branch discover
Switched to a new branch 'discover'

答案 6 :(得分:27)

git checkout -b serverfix origin/serverfix

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

git checkout --track origin/serverfix

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

git checkout serverfix

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

git checkout -b sf origin/serverfix

现在,您的本地分支sf将自动从origin / serverfix中拉出来。

来源:Pro Git 2nd Edition, written by Scott Chacon and Ben Straub(为便于阅读而削减)

答案 7 :(得分:20)

使用这个简单的命令:

git checkout -b 'your_branch' origin/'remote branch'

答案 8 :(得分:13)

git fetch

git branch -r

git checkout <branch_name>

答案 9 :(得分:13)

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

git fetch && git checkout the-branch-name

答案 10 :(得分:13)

最简单的方法,至少对我而言:

git fetch origin <branchName>

答案 11 :(得分:11)

我打字

git checkout <branch_name>

得到了

Branch <branch_name> set up to track remote branch <branch_name> from origin.
Switched to a new branch '<branch_name>'

答案 12 :(得分:10)

对我有帮助的是

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

git branch -r

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

git fetch && git checkout 'remote-branch-name'

答案 13 :(得分:9)

有时会要求您不要使用主分支并仅使用远程分支(因为我被要求)。所以你需要的只是远程分支。

所以要单独克隆远程分支(没有master),请执行此操作

git clone url --branch remote_branch_name

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

例如,

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --branch v3.15

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

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

答案 14 :(得分:7)

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

答案 15 :(得分:6)

让我们说你的遥控器是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

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

答案 16 :(得分:6)

我想为您提供oneliner命令,用于将所有远程分支提取到您的本地并切换到所需的新创建的本地分支:

git fetch && git checkout discover

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

Switched to a new branch 'discover'
Branch discover set up to track remote branch discover from origin.

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

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

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

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

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

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

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

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

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

答案 17 :(得分:5)

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

答案 18 :(得分:4)

只需尝试

$ git pull origin your_branch_name

答案 19 :(得分:3)

步骤如下;

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

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

  3. 然后在此分支上工作,您可以通过键入

    来验证您是否在该分支上
    git branch
    

    显示您当前所在的分支。

答案 20 :(得分:3)

如果你已经知道你的远程分支......

git remote
=> One
=> Two

您知道要结帐的分行名称。 br1.2.3.4 然后执行

git fetch One
=> returns all meta data of remote i.e. the branch name in question.

剩下的就是检查分支

git checkout br.1.2.3.4

然后从中取出任何新的分支。

答案 21 :(得分:3)

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

git fetch origin
git checkout branchName

您可以通过以下方式查看它是否已经存在于远程计算机上:

git branch -r

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

答案 22 :(得分:2)

检查您的.git/config,特别是该遥控器获取上的跟踪功能。

[remote "randomRemote"]
    url = git@github.com:someUser/someRepo.git
    fetch = +refs/heads/*:refs/remotes/randomRemote/*

如果heads/*指向randomRemote/*,则当您运行git fetch randomRemote时,它将获取所有分支。 然后你可以检查那个分支。

否则,

  1. 您需要使用此功能将远程分支添加到跟踪中。运行此选项后,请检查.git/config。你会明白的。 git remote set-branches --add randomRemote randomBranch

  2. 运行git fetch randomRemote。这将获取远程分支。

  3. 现在您可以运行git checkout randomBranch

答案 23 :(得分:2)

有很多选择,我的最爱是:

-备选方案1:

git fetch --all
git checkout YourBranch
  

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

-备选2:

git checkout -b 'YourBranch' origin/'YourRemote'
  

可能这是最简单的方法。

答案 24 :(得分:2)

如果您有一个使用--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.
%

在这种情况下,我会重新回复回购,但也许还有其他技术,例如git shallow clone (clone --depth) misses remote branches

答案 25 :(得分:1)

如果使用<repo_name>/.git/config下载存储库(仅克隆someg分支),则应修改[remote "origin"]文件。 替换或修改引用git fetch --all部分的提取目标的行,以使命令[remote "origin"] url = <repo_git_url> fetch = +refs/heads/master:refs/remotes/origin/master 发现所有分支:

/heads/master

确保将获取参数点设置为git fetch --all

请注意#include<iostream> using namespace std; void main() { string header="apple" float* p = new float[10]; double*Data = NULL; p = reinterpret_cast<float*>(reinterpret_cast<char*>(p) + header.length()); //fetch data from an another call// - it doesn't matter here as how it is returned. for(int i=0;i<10;i++) { p[i] = static_cast<float>(Data[i]); } //publish the output to the debug window // delete[] p; // throws _block_type_is_valid(pHead->nblockuse) crash } ,因为这将获取全部,因此可能需要很长时间。

答案 26 :(得分:1)

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

git fetch --all

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

答案 27 :(得分:1)

git branch <name> --track origin/<name>

答案 28 :(得分:1)

你使用'git pull'来保持你的分支分开。我将使用实际的回购和分支名称来帮助,因为'lbranch'和'rbranch'很难破译。

让我们用:

  • myteam.unfuddle.com =远程git服务器
  • tlc =存在回购的虚拟项目帐户
  • daves_branch =远程分支名称

    无论有多少个分支,您或任何同事都可以运行此操作以仅提取您的分支:

    git init
    git pull git@myteam.unfuddle.com:myteam/tlc daves_branch:refs/remotes/origin/daves_branch
    

  • 答案 29 :(得分:0)

    一个简单的命令 - &#34; git checkout remote_branch_name&#34;将帮助您创建一个在远程分支中具有所有更改的本地分支。

    答案 30 :(得分:-2)

    git checkout -b branch_name
    git pull remote_name branch_name