我有一个master和一个development分支,都被推送到GitHub 。 我已经clone d, pull ed和fetch ed,但是除了master分支以外,我仍然无法获得任何东西。

我敢肯定我遗漏了一些明显的东西,但是我已经阅读了手册,一点也没有感到高兴。


#1楼

您可以轻松切换到分支,而无需使用奇特的“ git checkout -b somebranch origin / somebranch”语法。 您可以这样做:

git checkout somebranch

Git会自动做正确的事情:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git将检查在一个远程站点中是否存在同名分支,如果存在,它将以与您明确指定它是远程分支相同的方式进行跟踪。 从Git 1.8.2.1的git-checkout手册页中:

如果未找到<branch>,但确实在一个具有匹配名称的远程站点(称为<remote>)中存在跟踪分支,则将其等同于

 $ git checkout -b <branch> --track <remote>/<branch> 

#2楼

使用我的工具git_remote_branch (您需要在机器上安装Ruby)。 它是专门为简化远程分支操作而构建的。

每次它代表您执行操作时,它将在控制台上以红色打印。 随着时间的流逝,它们最终进入您的大脑:-)

如果您不想让grb代表您运行命令,则只需使用“说明”功能。 这些命令将被打印到您的控制台上,而不是为您执行。

最后,所有命令都具有别名,以便于记忆。

请注意,这是Alpha软件 ;-)

这是运行grb help时的帮助:

git_remote_branch version 0.2.6

  Usage:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Notes:
  - If origin_server is not specified, the name 'origin' is assumed 
    (git's default)
  - The rename functionality renames the current branch

  The explain meta-command: you can also prepend any command with the 
keyword 'explain'. Instead of executing the command, git_remote_branch 
will simply output the list of commands you need to run to accomplish 
that goal.

  Example: 
    grb explain create
    grb explain create my_branch github

  All commands also have aliases:
  create: create, new
  delete: delete, destroy, kill, remove, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch

#3楼

关于,

$ git checkout -b实验来源/实验

使用

$ git checkout -t origin/experimental

或更冗长但更容易记住

$ git checkout --track origin/experimental

在跟踪远程存储库方面可能会更好。


#4楼

迟到总比不到好,但这是执行此操作的最佳方法:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

至此,您已经获得了带有所有分支的远程仓库的完整副本(使用git branch验证)。 如果您的远程--bare有自己的遥控器,则可以使用--mirror而不是--bare


#5楼

使用别名。 虽然没有任何本地Git一线客机,但您可以将自己定义为

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

然后将其用作

git clone-branches

#6楼

对于复制粘贴到命令行:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

为了提高可读性:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


这将:

  1. 签出主人(以便我们可以删除我们所在的分支)
  2. 选择要签出的遥控器 (将其更改为您拥有的任何遥控器)
  3. 遍历遥控器的所有分支 (主服务器和HEAD除外)
    1. 删除本地分支(以便我们可以签出强制更新的分支)
    2. 从远程签出分支
  4. 签出主人(为此)

基于VonC的 答案


#7楼

这并不太复杂,非常简单直接的步骤如下:

git fetch origin这会将所有远程分支带到您的本地。

git branch -a这将向您显示所有远程分支。

git checkout --track origin/<branch you want to checkout>

通过以下命令验证您是否在所需的分支中;

git branch

输出将像这样;

*your current branch 
some branch2
some branch3 

请注意,*符号表示当前分支。


#8楼

为什么只看到“主人”

git clone下载所有远程远程分支,但即使文件位于您的新存储库中,也仍然将它们视为“远程”。 唯一的例外是,克隆过程会从称为“ master”的远程分支创建一个名为“ master”的本地分支。 默认情况下, git branch仅显示本地分支,这就是为什么您只看到“ master”的原因。

git branch -a显示所有分支, 包括远程分支


如何获得当地分支机构

如果您确实想在分支上工作,则可能需要它的“本地”版本。 要简单地从远程分支创建本地分支(无需检出它们,从而不更改工作目录的内容) ,可以这样进行:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

在此示例中, branchone是您基于origin/branchone创建的本地分支的名称; 如果您想使用不同的名称创建本地分支,则可以执行以下操作:

git branch localbranchname origin/branchone

创建本地分支后,您可以使用git branch查看它(请记住,您不需要-a即可查看本地分支)。


#9楼

您只需要使用“ git clone”即可获取所有分支。

git clone <your_http_url>

即使只看到master分支,也可以使用“ git branch -a”查看所有分支。

git branch -a

您可以切换到任何已有的分支。

git checkout <your_branch_name>

不用担心,在您进行“ git clone”操作后,无需连接远程仓库,当您关闭wifi时,“ git branch -a”和“ git checkout”可以成功运行。 因此证明,当您执行“ git clone”时,它已经从远程仓库中复制了所有分支。 之后,您不需要远程回购,您的本地已经拥有所有分支机构的代码。


#10楼

这些答案都没有解决这个问题,只是没有人在正确的轨道上。

我在将存储库从一个服务器/系统移动到另一个服务器/系统时遇到了麻烦。 当我克隆存储库时,它只为master创建一个本地分支,因此当我推送到新的远程服务器时,只推送了master分支。

因此,我发现这两种方法非常有用。 希望他们能帮助别人。

方法1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

方法2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

#11楼

在查看问题的答案之一时,我注意到可以将其缩短:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

但是要注意,如果远程分支之一被命名为admin_master,它将不会被下载!

感谢bigfish的初衷


#12楼

这是另一个简短的单线命令,它为所有远程分支创建本地分支:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

如果已经创建了跟踪本地分支,它也可以正常工作。 您可以在第一个git clone或之后的任何时间调用它。

如果您不需要在克隆后检出master分支,请使用

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout

#13楼

我在这里看到的所有答案都是有效的,但是有一种更干净的方法来克隆存储库并一次拉出所有分支。

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

$ 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”命令查看该文件夹。

  1. 第二步

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

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

抓取当前文件夹内的所有内容,并在本地计算机上创建所有分支,因此将其作为常规存储库。

$ git reset --hard

因此,现在您只需键入命令“ git branch”,即可看到所有分支均已下载。

这是一种可以一次克隆所有分支的git存储库的快速方法,但您不想以此方式对每个项目进行操作。


#14楼

使用您记得的命令

我正在使用Bitbucket,这是Atlassian的存储库托管服务。 因此,我尝试遵循他们的文档。 那对我来说非常合适。 使用以下简单易用的命令,您可以检出远程分支。

首先,克隆您的存储库,然后更改到目标文件夹。 最后但并非最不重要的是提取和结帐:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

而已。 这是一个更真实的例子:

git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

您将在docs中找到有关命令的详细信息: 克隆命令提取命令检出命令


#15楼

Git通常(未指定时)从一个或多个其他存储库中获取所有分支和/或标签(参考,请参阅: git ls-refs )以及完成其历史记录所需的对象。 换句话说,它获取已下载对象可访问的对象。 请参阅: git fetch实际做什么?

有时您可能有一些分支/标签没有直接连接到当前分支/标签,因此git pull --all / git fetch --all在这种情况下无济于事,但是您可以通过以下方式列出它们:

git ls-remote -h -t origin

并通过知道引用名称手动获取它们。

因此,要全部获取 ,请尝试:

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

如果对存储库进行了浅化处理,则--depth=10000参数可能会有所帮助。

然后再次检查所有分支:

git branch -avv

如果上述方法无济于事,则需要手动将丢失的分支添加到跟踪列表中(因为它们以某种方式丢失了):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

通过git remote set-branches例如:

git remote set-branches --add origin missing_branch

因此,它在获取后可能会显示在remotes/origin下:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

故障排除

如果您仍然无法获得master分支以外的任何其他内容,请检查以下内容:

  • 仔细检查您的遥控器( git remote -v ),例如
    • 验证git config branch.master.remoteorigin
    • 通过以下命令检查origin指向正确的URL: git remote show origin (请参阅此帖子 )。

#16楼

我写了这个小的Powershell函数,以便能够检出我的所有git分支,这些分支位于源远程。

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

我的git设置库中可以找到更多的git功能


#17楼

#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

这些代码会将所有远程分支代码拉到本地存储库。


#18楼

从本地存储库克隆不适用于git clone和git fetch:许多分支/标签将保持未提取状态。

获得具有所有分支和标签的克隆。

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

要获得具有所有分支和标签以及工作副本的克隆,请执行以下操作:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

#19楼

截至2017年初, 此评论中的答案有效:

git fetch <origin-name> <branch-name>为您降低了分支。 虽然这不会一次拉出所有分支,但是您可以按分支单独执行此操作。


#20楼

我需要做的完全一样。 这是我的Ruby脚本。

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

#21楼

好的,克隆仓库时,所有分支都在那里...

如果您只是做git branch ,它们就是隐藏的...

因此,如果您想查看所有分支名称,只需添加--all标志,如下所示:

git branch --allgit branch -a

如果您仅结帐至分支机构,则将获得所需的一切。

但是克隆后如果其他人创建的分支又如何呢?

在这种情况下,请执行以下操作:

git fetch

然后再次检查所有分支...

如果您想同时提取和结帐,可以执行以下操作:

git fetch && git checkout your_branch_name

还为您创建了以下图像,以简化我所说的内容:

git branch --all获取所有分支


#22楼

如果您要一次获取许多远程分支,请执行以下操作:

$ git pull --all

现在,您可以根据需要签出任何分支,而无需访问远程存储库。


#23楼

这个Bash脚本帮助我:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

它将为所有远程分支(主服务器除外)创建跟踪分支(您可能是从原始克隆命令获得的)。 我认为您可能仍需要做一个

git fetch --all
git pull --all

为了确定。

一班轮git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\\*?\\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\\n)} else {$d{$_}=1}' | csh -xfs git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\\*?\\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\\n)} else {$d{$_}=1}' | csh -xfs
像往常一样:我们知道,在复制rm -rf Universe之前先对您的设置进行测试

一线积分归功于用户CFI


#24楼

原始回购上的git clone --mirror对此非常有效。

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin

#25楼

这是使用awk的答案。 如果在新的仓库上使用该方法就足够了。

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

现有分支将仅被检出或声明为已经存在,但是可以添加过滤器以避免冲突。

也可以对其进行修改,以便调用显式的git checkout -b <branch> -t <remote>/<branch>命令。

该答案遵循Nikos C.想法


另外,我们可以指定远程分支。 这是基于murphytalk答案

git branch -r | awk '{ system("git checkout -t " $NF) }'

它在冲突时引发致命的错误消息,但我认为它们无害。


这两个命令都可以使用别名。

使用没人答案作为参考,我们可以使用以下命令来创建别名:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

就个人而言,我将使用全track-all或全track-all-branches


#26楼

只要这样做:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

您会看到,'git clone git://example.com/myprojectt'会获取所有内容,甚至包括分支,您只需要检出它们,即可创建本地分支。


#27楼

git clone应该复制整个存储库。 尝试克隆它,然后运行git branch -a 。 它应该列出所有分支。 如果那么您想切换到分支“ foo”而不是“ master”,请使用git checkout foo


#28楼

当您执行“ git clone git:// location”时,将提取所有分支和标记。

为了在特定的远程分支之上工作,假设它是源远程:

git checkout -b branch origin/branchname

#29楼

您正在执行的访存应获取所有远程分支,但不会为它们创建本地分支。 如果使用gitk,则应该看到远程分支描述为“ remotes / origin / dev”或类似内容。

要基于远程分支创建本地分支,请执行以下操作:

git checkout -b dev refs/remotes/origin/dev

应该返回如下内容:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

现在,当您在dev分支上时,“ git pull”将把您的本地dev更新到与远程dev分支相同的位置。 请注意,它将获取所有分支,但仅将您所在的分支拉到树的顶部。


#30楼

首先,克隆一个远程Git存储库并cd到其中:

$ git clone git://example.com/myproject
$ cd myproject

接下来,查看存储库中的本地分支:

$ git branch
* master

但是您的存储库中还隐藏着其他分支! 您可以使用-a标志查看它们:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

如果您只想快速浏览上游分支机构,则可以直接查看:

$ git checkout origin/experimental

但是,如果要在该分支上工作,则需要创建一个本地跟踪分支,该分支可以通过以下方式自动完成:

$ git checkout experimental

你会看到

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

最后一行引发了一些人:“新分支”-是吗? 这实际上意味着分支是从索引中提取的,并为您本地创建。 一行实际上更具信息性,因为它告诉您正在建立分支以跟踪远程分支,这通常意味着origin / branch_name分支

现在,如果您查看本地分支机构,将看到以下内容:

$ git branch
* experimental
  master

实际上,您可以使用git remote跟踪多个远程存储库。

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

此时,事情变得非常疯狂,因此运行gitk看看发生了什么:

$ gitk --all &

#31楼

使用--mirror选项似乎可以正确复制remote跟踪分支。 但是,它会将存储库设置为裸存储库,因此之后必须将其转换回普通存储库。

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

参考: Git常见问题解答:如何克隆具有所有远程跟踪分支的存储库?

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐