remote - git跟踪远程分支




Git获取远程分支 (16)

我和我的同事正在研究同一个存储库,我们将它分为两​​个分支,每个分支在技术上适用于不同的项目,但它们有相似之处,所以我们有时想要从分支中重新提交给* master。

但是,我有分支,我的同事怎能具体拉那个分支。 回购的git clone似乎并没有为他在当地创建分支,尽管我可以在推动我的结局之后看到他们生活在无情的状态。

另外,当我最初做分支时,我做了-b checkout 。 不知道这是否有很大的不同?

iMac:test_solar dave$ git branch -r
origin/HEAD -> origin/master
origin/daves_branch
origin/discover
origin/master

git fetch origin discover
git checkout discover

这是我跑的命令。 但绝对不行。 我希望能够检出该分支,然后推送并恢复来自各个协作者或工作站的分支机构更改。


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


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


标题和问题很混乱:

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

如果问题是我如何获得一个远程分支来处理远程分支,或者如何检查一个远程分支,一个更简单的解决方案是:

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

git checkout <branch_name>

如果没有找到本地的<branch_name>但确实在一个具有匹配名称的远程设备中存在跟踪分支, <branch_name>视为等同于:

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

checkout

为你的朋友:

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

一个简单的命令 - “git checkout remote_branch_name”将帮助您创建一个本地分支,其中包含远程分支中的所有更改。


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

还有一个git ls-remote命令可以查看该远程的所有参考和标签。


假设你的远程是[email protected],并且你想要它的random_branch分支。 该过程应如下所示:

  1. 首先检查您的遥控器清单

    git remote -v

  2. 如果您在上述命令的输出中没有[email protected]远程文件,您可以将其添加

    git remote add xyz [email protected]

  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分支。


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

在这种情况下,我会reclone回购,但也许有其他技术,例如git浅克隆(克隆 - 深度)错过远程分支


如果您试图“签出”一个新的远程分支(只存在于远程,但不在本地),以下是您需要的东西:

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

这假定你想从原点获取。 如果不是,请用您的远程名称替换原点


您需要创建一个跟踪远程分支的本地分支。 以下命令将创建一个名为daves_branch的本地分支,用于跟踪远程分支源/ daves_branch 。 当你推动你的改变时,远程分支将被更新。

对于大多数版本的git:

git checkout --track origin/daves_branch

--trackgit checkout -b [branch] [remotename]/[branch]缩写git checkout -b [branch] [remotename]/[branch]其中[remotename]是本例中的起源 ,[branch]是两次相同的daves_branch

对于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 : http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches


我使用了fetch然后是checkout ...

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

...其中<rbranch>是远程分支或源代码<lbranch>是您要跟踪的尚不存在的本地分支或目标引用 ,以及您可能想要将其命名为远程分支或源代码引用。 这在<refspec>的解释中的options下进行了解释。

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

同样在这篇相似的SO文章中的答案显示,如果您没有在fetch命名本地分支,那么当您使用-b标志签出时仍然可以创建它。 IE: git fetch <remote> <branch>后跟git checkout -b <branch> <remote>/<branch>与我的初始答案完全一样。 显然,如果您的回购只有一个远程,那么您可以在fetch后执行git checkout <branch> ,它会为您创建一个本地分支。 EG:您刚刚克隆了一个回购协议,并希望查看远程的其他分支。

我相信一些fetch文档可能已经逐字复制。 特别是options中的<refspec>部分是相同的。 然而,我不相信fetchmerge ,所以如果你离开冒号的目标端,空的fetch 应该什么也不做

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

我想这只有在你想在本地复制一个远程分支时才有用,但不一定马上检查它。 否则,我现在将使用上面接受的答案 ,这在结帐说明的第一部分中详细解释,后面在--track的解释下的options部分中详细解释,因为它是--track的。 那么...有点类似于1-liner,因为你仍然必须首先运行git fetch <remote>

仅供参考: <refspecs> (source:destination)的顺序解释了用于删除远程分支的奇怪的Git-1.7前方法。 IE:将任何东西都压入目的地refspec。


最简单的方法来做到这一点,至少对我而言:

git fetch origin <branchName>

有了这个简单的命令:

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

检查你的.git/config ,特别是对那个远程的提取进行跟踪。

[remote "randomRemote"]
    url = [email protected]: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


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

git fetch --all
git checkout myBranch

我收到了这条消息:

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

试试吧

$ git pull origin your_branch_name


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,由Scott Chacon和Ben Straub撰写 (剪切以提高可读性)





git-fetch