git从远程存储库中提取所有分支

git从远程存储库中提取所有分支,git,version-control,git-branch,remote-branch,Git,Version Control,Git Branch,Remote Branch,如何将所有远程分支拉入自己的存储库 如果我键入: git branch -a git branch 我会得到一个长长的分支列表,但如果我键入: git branch -a git branch 我只看到其中两个 如何将所有分支拉入本地列表 我知道我能做到: git checkout --track origin/branch-name 但这一次只能提取和检出一个分支。有没有办法一次完成这一切,而不用运行git签出的繁琐工作——一遍又一遍地跟踪源代码/分支名称 附言。 我尝试了以下

如何将所有远程分支拉入自己的存储库

如果我键入:

git branch -a
git branch 
我会得到一个长长的分支列表,但如果我键入:

git branch -a
git branch 
我只看到其中两个

如何将所有分支拉入本地列表

我知道我能做到:

git checkout --track origin/branch-name
但这一次只能提取和检出一个分支。有没有办法一次完成这一切,而不用运行git签出的繁琐工作——一遍又一遍地跟踪源代码/分支名称


附言。 我尝试了以下命令,但没有一个命令使远程分支出现在我的git分支列表中:


阅读此解释

首先,让我们澄清一些git术语:

  • 获取:从远程repo获取内容(或更新)
  • pull:获取(如上所述)并在一个步骤中合并
最初的海报没有提到合并,所以我可以用正确的git术语来猜测 他甚至可能想问“git从远程存储库获取所有分支”

如果您在
git branch-a
中看到分支,那么您已经获取了它们。 您可以通过给出命令
git show remotes/origin/some branch:some file

或者可以执行,例如
git diff remotes/origin/some branch master

您甚至可以将它们签出git checkout remotes/origin/some branch

(为了确保您可以卸下网络电缆,您将看到命令在不联系远程repo的情况下工作。)

名为remotes/…的分支。。。被称为远程分支,但它们已经被提取到您的repo。它们是只读的,您无法修改它们(这就是签出时显示消息的原因)。尽管它们反映了上次获取或拉取操作时远程回购的状态,但实际上它们存储在本地

如果您签出某个分支,而某个分支还不存在,但remotes/origin/some分支存在,git将为您创建一个名为some branch的跟踪分支(1)。同样,这是一个本地操作,所有数据以前都已提取过(或者,如果您最近没有提取,您将开始使用过时的版本)。最初,跟踪分支的内容与其远程分支相同。但是,您可以在本地修改跟踪分支

git工作区每次包含一个分支的状态。因此,您关于同时检出所有远程分支的问题在git上下文中没有真正意义。你可以一个接一个地查看它们。但每次你检查下一个,前一个将从工作区消失。当然,可以按照中所示编写此操作的脚本,但如果只剩下最后一步,那么编写大规模操作的脚本又有什么意义呢

那么,这个问题是否可能是由误解引起的,假设远程分支只能远程存储,而不是本地存储,您只是想确保所有内容都是本地的?如果您确实希望一次签出多个分支机构,您可以在本地克隆您的回购协议,并将不同的分支机构签出到不同的工作区域。(二)

很快:如果您想确保您在本地拥有 远程repo只需使用git fetch[repo]。除非您调整了配置,否则这将获取所有分支,即更新现有远程分支并创建新的远程分支(如果适用)

(1) 在简单的标准情况下也是如此。在具有多个遥控器或手动配置遥控器的更复杂的情况下,您可能需要--track选项来精确指定所需的内容


(2) 这个用例有一个新特性
git worktree
。然而,到2018年初,它仍然被标记为实验性的,我通常用于生成所有可见分支的命令,详细信息见“”:

或:

要获得更高的可读性:


第二个用于创建跟踪远程分支的新本地分支。

您应该尝试以下操作:-

$ git fetch --all
$ for branch in `git branch -r | cut -d '/' -f2-` ; do git checkout $branch && git pull origin $branch ; done

我一直都用这个,效果很好

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

可能是重复的,但你为什么要这样做呢?我总是用我的一句话:@Pigueiras是对的,问题是重复的。但奈特尔的评论是正确的:我也看不出这个问题的目的。我可能猜用户再次被git术语误导了。远程分支不是任何远程分支,它是远程分支的本地快照。@VonC-请将其作为此问题的答案发布,以便我标记为已解决?谢谢问题是,如果分支没有出现在
git branch
列表中,我就无法合并它们(无论您决定如何调用它们)——而且碰巧我需要同时合并很多分支,所以我需要一种快速的方法让它们都可访问。VonC的回答很有帮助。
cut-d'/'
将在分支名称中添加一个
/
,如
feature/123 branch
。这就像一个符咒一样有效!说明OS和Shell可能是个好主意,因为
grep
不是我见过的ms dos命令=p这是一个bash脚本,可以由Git for Windows bash解释。Git发行版附带bash和200多个Linux命令,包括grep.exe。
$ git fetch --all
$ for branch in `git branch -r | cut -d '/' -f2-` ; do git checkout $branch && git pull origin $branch ; done
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all