如何获取所有Git分支

时间:2012-04-25 09:05:26

标签: git branch git-branch

我克隆了一个Git存储库,它包含大约五个分支。但是,当我git branch时,我只看到其中一个:

$ git branch
* master

我知道我可以git branch -a查看所有分支,但是如何在本地拉出所有分支,这样当我git branch时,它会显示以下内容?

$ git branch
* master
* staging
* etc...

32 个答案:

答案 0 :(得分:1618)

您可以从所有遥控器中获取一个分支,如下所示:

git fetch --all

fetch更新远程分支的本地副本,因此对于您的本地分支机构来说这是安全的但是

  1. fetch不会更新本地分支机构(跟踪远程分支机构);如果你想更新你的本地分支,你仍然需要拉每个分支。

  2. fetch不会创建本地分支机构(跟踪远程分支机构),您必须手动执行此操作。如果要列出所有远程分支: git branch -a

  3. 更新跟踪远程分支的本地分支:

    git pull --all
    

    然而,这仍然不足。它仅适用于跟踪远程分支的本地分支。要跟踪所有远程分支,请执行此oneliner BEFORE git pull --all

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

    TL; DR版本

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

    (看起来拉取所有遥控器的所有分支,但我总是首先获取以确定。)

    仅当服务器上存在未被本地分支跟踪的远程分支时,才运行第一个命令。

    P.S。 AFAIK git fetch --allgit remote update是等效的。



    Kamil Szot的comment,其中74人(至少)认为有用。

      

    我不得不使用:

    for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
    
         

    因为您的代码创建了名为origin/branchname的本地分支   我得到“refname”origin / branchname'时我不明确   提到它。

答案 1 :(得分:568)

列出远程分支:
git branch -r

您可以将它们作为本地分支机构查看: git checkout -b LocalName origin/remotebranchname

答案 2 :(得分:176)

您需要创建跟踪远程分支的本地分支。

假设您只有一个名为origin的遥控器,此代码段将为所有远程跟踪分区创建本地分支:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

之后,git fetch --all将更新远程分支的所有本地副本。

此外,git pull --all将更新您的本地跟踪分支,但根据您的本地提交以及如何设置'merge'configure选项,它可能会创建合并提交,快进或失败。

答案 3 :(得分:106)

如果你这样做:

git fetch origin
然后他们将在当地全部。如果你然后执行:

git branch -a

你会看到它们被列为遥控器/原点/分支名称。因为他们在当地,你可以随心所欲地做任何事情。例如:

git diff origin/branch-name 

git merge origin/branch-name

git checkout -b some-branch origin/branch-name

答案 4 :(得分:57)

$ git remote update
$ git pull --all

这假设跟踪了所有分支。

如果不是,你可以用Bash解雇这个:

for remote in `git branch -r `; do git branch --track $remote; done

然后运行命令。

答案 5 :(得分:45)

使用git fetch && git checkout RemoteBranchName

对我来说非常好......

答案 6 :(得分:40)

Bash for循环对我不起作用,但这完全符合我的要求。我原产地的所有分支都在本地镜像为同名。

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

请参阅下面的Mike DuPont评论。我想我试图在Jenkins服务器上执行此操作,使其处于分离头模式。

答案 7 :(得分:30)

克隆存储库时,实际下载了分支的所有信息,但隐藏了分支。使用命令

$ git branch -a

您可以使用命令

显示存储库的所有分支
$ git checkout -b branchname origin/branchname

然后您可以一次手动“下载”它们。

然而,有一种更清洁,更快捷的方式,虽然它有点复杂。您需要三个步骤来完成此任务:

  1. 第一步

    在您的计算机上创建一个新的空文件夹,并从存储库中克隆.git文件夹的镜像副本:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    文件夹my_repo_folder中的本地存储库仍为空,现在只有一个隐藏的.git文件夹,您可以从终端看到“ls -alt”命令。

  2. 第二步

    通过将git配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换到常规存储库:

    $ git config --bool core.bare false
    
  3. 第三步

    抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的回购。

    $ git reset --hard
    
  4. 现在您只需输入命令git branch即可看到所有分支都已下载。

    这是您可以快速克隆包含所有分支的git存储库的方法,但这并不是您希望以这种方式为每个项目执行的操作。

答案 8 :(得分:24)

我通常只使用这样的命令:

git fetch origin
git checkout --track origin/remote-branch

更短的版本:

git fetch origin
git checkout -t origin/remote-branch

答案 9 :(得分:24)

您可以通过以下方式获取所有分支:

git fetch --all

或:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

如果您使存储库变浅,--depth=10000参数可能会有所帮助。

要拉出所有分支,请使用:

git pull --all

如果以上操作不起作用,则在上面的命令前加上:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

因为remote.origin.fetch在获取时只支持特定分支,尤其是当您使用--single-branch克隆回购时。请通过以下方式检查:git config remote.origin.fetch

之后你应该能够结账任何分支。

另见:

要将所有分支推送到遥控器,请使用:

git push --all

最终--mirror镜像所有引用。

如果您的目标是复制存储库,请参阅GitHub上的Duplicating a repository文章。

答案 10 :(得分:18)

为什么没人回答男人的问题并解释发生了什么事?

  1. 确保您正在跟踪所有远程分支(或您要跟踪的任何分支)
  2. 更新您的本地分支以反映远程分支。

跟踪所有远程分支机构:

跟踪远程仓库中存在的所有分支。

手动执行:

您将<branch>替换为git branch -r输出中显示的分支。

git branch -r
git branch --track <branch>

使用bash脚本

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

更新有关本地计算机上的远程分支的信息:

这将从您在本地存储库中跟踪的远程存储库中获取分支上的更新。这不会更改您的本地分支机构。现在,您本地的git repo知道远程repo分支上已发生的事情。例如,一个新的提交已被推送到远程主服务器,现在执行提取操作将提醒您本地主服务器落后1次提交。

git fetch --all

更新有关本地计算机上远程分支的信息并更新本地分支:

对从远程分支到本地分支的所有分支进行提取和合并。例如,一个新的提交已被推送到远程主服务器,执行一次拉取将更新有关远程分支中更改的本地存储库,然后将这些更改合并到本地分支中。由于合并冲突,这可能会造成混乱。

git pull --all

答案 11 :(得分:15)

我相信您已通过以下方式克隆了存储库:

git clone https://github.com/pathOfrepository

现在使用cd:

转到该文件夹
cd pathOfrepository

如果您输入git status,则可以看到所有内容:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

要查看所有隐藏的分支类型:

 git branch -a

它将列出所有远程分支。

现在,如果您想在任何特定分支上结帐,只需输入:

git checkout -b localBranchName origin/RemteBranchName

答案 12 :(得分:14)

如果您在这里寻求获得所有分支的解决方案,然后将所有内容迁移到另一个Git服务器,我将以下过程放在一起。如果您只想让所有分支在本地更新,请停在第一个空行。

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

答案 13 :(得分:12)

克隆主存储库后,您就可以执行

git fetch && git checkout <branchname>

答案 14 :(得分:9)

循环似乎对我不起作用,我想忽略原点/主人。 这对我有用。

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

之后:

git fetch --all
git pull --all

答案 15 :(得分:9)

确保.git/config文件中的所有远程分支都可以获取。

在此示例中,只有origin/production分支是可获取的,即使您尝试执行git fetch --all也不会发生任何事情,只需获取production分支:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

此行应替换为:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

然后运行git fetch等...

答案 16 :(得分:7)

这三个命令将获得所有分支:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

答案 17 :(得分:4)

我写了一个小脚本来管理克隆新的仓库并为所有远程分支机构创建本地分支。

您可以找到最新版本here

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

要使用它,只需将其复制到您的git bin目录(对我来说,即C:\Program Files (x86)\Git\bin\git-cloneall),然后在命令行中:

git cloneall [standard-clone-options] <url>

它像往常一样克隆,但为所有远程分支创建本地跟踪分支。

答案 18 :(得分:3)

|‾‾‾‾‾‾‾‾‾‾‾‾‾fetch/clone‾‾‾‾‾‾‾‾‾‾‾‾↓   |‾‾‾‾‾‾‾‾‾‾‾‾checkout‾‾‾‾‾‾‾‾‾‾↓   
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾pull‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾↓
Remote repository (`origin`) <=> Local repository <=> Index <=> Workspace
↑_________________push_______________|   ↑____commit____|  ↑____add_____| 

# 拉取远程仓库所有分支信息 → 本地仓库
# fetch all remote repository branch meta → local repository
git remote set-branches origin '*'
git fetch -v

# 把所有远程分支数据搞到本地
# fetch all remote repository branch data → local repository
git branch -r | grep -v '\->' | while read remote; do git branch "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

答案 19 :(得分:3)

设置别名:(基于最高答案)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

现在要跟踪所有分支:

git track-all-branches

答案 20 :(得分:2)

对于使用PowerShell的Windows用户:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

答案 21 :(得分:2)

这是公认的答案中提供的单线的Perl版本:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

如果需要,可以将输出文件作为Shell脚本运行。

我们意外删除了Stash项目存储库。幸运的是,有人在意外损失发生之前就制造了一把叉子。我将叉子克隆到本地(将省略有关操作的详细信息)。将叉子完全放在本地后,我就跑了一根单缸纸。我修改了遥控器的URL(以我的情况为例),以指向我们要恢复到的目标存储库:

git remote set-url origin <remote-url>

最后将所有分支推向原点,就像这样:

git push --all origin

我们又重新营业了。

答案 22 :(得分:1)

您可以像这样通过这一行命令获取所有分支:

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

答案 23 :(得分:1)

为避免出现错误消息“致命:名为'origin / master'的分支已存在。”,您需要执行以下操作:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

答案 24 :(得分:1)

如果您对fetch --all有疑问,请跟踪远程分支:

git checkout --track origin/%branchname%

答案 25 :(得分:1)

我们可以将所有分支或标记名称放在一个临时文件中,然后为每个名称/标记执行git pull:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

答案 26 :(得分:0)

如何获取跟踪单个遥控器的所有Git分支。

此功能已经过测试,可以在Windows 10的Red Hat和Git Bash上运行。


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

说明:

一个班轮签出,然后获取除HEAD以外的所有分支。

列出远程跟踪分支。

git branch -r

忽略HEAD。

grep -v ' -> '

取消分支名称。

cut -d"/" -f2

检出跟踪单个遥控器的所有分支。

git checkout $branch

获取已签出的分支。

git fetch

从技术上讲,新的本地分支不需要提取。

这可以用于fetchpull分支,这些分支都是新的,并且在遥控器上有更改。

请确保仅在准备好合并时才拉动。


测试设置

检出带有SSH URL的存储库。

git clone git@repository.git

之前

检查本地分支。

$ git branch
* master

执行命令

执行一根班轮。

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

之后

检查本地分支是否包括远程分支。

$ git branch
  cicd
  master
* preprod

答案 27 :(得分:0)

对于Visual Studio用户,在程序包管理器控制台上:

git分支| %{git从上游获取; git merge上游/主人}

答案 28 :(得分:0)

尝试了很多方法,只有这一方法很简单,对我有用。

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

答案 29 :(得分:0)

git fetch --all

通过使用此注释,您可以从已添加为远程存储库的所有分支中获取代码

答案 30 :(得分:0)

git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

现在,您的yourNewLocalBranchName就是requiredRemoteBranch

答案 31 :(得分:0)

根据Learath2的回答,这是我在git clone [...]cd进入创建的目录后所做的事情:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

为我工作,但我不知道它会为你工作。小心。