我有一个 master 和一个 development 分支,都被推到 GitHub. 。我有 cloned、 pull编辑,和 fetched,但除了 master 分支回来。

我确信我错过了一些明显的东西,但我已经阅读了手册,但我一点也不高兴。

有帮助吗?

解决方案

首先,克隆一个远程 git 存储库和 光盘 进去:

$ 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 &

其他提示

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

$ git pull --all

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

重击 脚本帮助了我:

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

它将为所有远程分支创建跟踪分支,但 master 除外(您可能从原始克隆命令中获得)。我想你可能还需要做一个

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 照常:在复制我们所知的 rm -rf Universe 之前测试您的设置

一行的积分归用户 cfi

使用 --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 常见问题解答:如何克隆包含所有远程跟踪分支的存储库?

您可以轻松切换到分支,而无需使用花哨的“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 手册页:

如果u003Cbranch>找不到,但确实存在一个遥控器中的跟踪分支(调用它u003Cremote>)具有匹配名称,将其视为等同于

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

关于,

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

使用

$ git checkout -t origin/experimental

或者更冗长但更容易记住

$ git checkout --track origin/experimental

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

您正在执行的提取操作应该获取所有远程分支,但不会为它们创建本地分支。如果您使用 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 分支相同的点。请注意,它将获取所有分支,但只会将您所在的分支拉到树的顶部。

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

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

git checkout -b branch origin/branchname

使用别名。虽然没有任何本地 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

为什么你只看到“大师”

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 查看当地分支机构)。

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

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

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

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

通过以下命令验证是否处于所需分支;

git branch

输出会像这样;

*your current branch 
some branch2
some branch3 

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

迟到总比不到好,但最好的方法是:

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

此时,您拥有远程存储库的完整副本及其所有分支(使用 git branch)。您可以使用 --mirror 代替 --bare 如果您的远程存储库有自己的遥控器。

只需这样做:

$ 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”会获取所有内容,甚至是分支,你只需检出它们,然后就会创建你的本地分支。

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

git clone <your_http_url>

即使您只看到主分支,您也可以使用“gitbranch -a”来查看所有分支。

git branch -a

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

git checkout <your_branch_name>

不用担心“git clone”后,不需要连接远程仓库,“gitbranch -a”和“git checkout”在关闭wifi时也可以成功运行。所以证明当你执行“git clone”时,它已经从远程仓库复制了所有分支。之后,您不需要远程存储库,您的本地已经拥有所有分支的代码。

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

使用我的工具 git_remote_branch (您需要在计算机上安装 Ruby)。它是专门为使远程分支操作变得非常简单而构建的。

每次它代表您执行操作时,都会在控制台上以红色打印该操作。随着时间的推移,它们最终会融入你的大脑:-)

如果您不希望 grb 代表您运行命令,只需使用“解释”功能即可。这些命令将打印到您的控制台,而不是为您执行。

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

请注意,这是 阿尔法软件 ;-)

这是运行 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

我在这里看到的所有答案都是有效的,但是有一种更简洁的方法来克隆存储库并立即提取所有分支。

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

$ 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

所以现在你只需输入命令“gitbranch”,你就可以看到所有分支都已下载。

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

查看问题的答案之一,我注意到可以缩短它:

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

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

感谢bigfish的原创想法

从本地存储库克隆不适用于 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

好的, 当你克隆你的存储库时,你在那里拥有所有分支......

如果你只是这样做 git branch, ,它们有点隐藏......

因此,如果您想查看所有分支名称,只需添加 --all 像这样标记:

git branch --all 或者 git branch -a

如果您只需到分行结账,您就可以获得所需的一切。

但是如果你克隆后分支是别人创建的呢?

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

git fetch

并再次检查所有分支...

如果您想同时获取和结账,您可以这样做:

git fetch && git checkout your_branch_name

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

git branch --all to get all branches

#!/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

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

对于复制粘贴到命令行:

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. 检查 master (以便我们可以删除我们所在的分支)
  2. 选择远程 结帐(将其更改为您拥有的任何遥控器)
  3. 循环遍历所有分支 除主机和 HEAD 之外的遥控器
    1. 删除 本地分支(以便我们可以检查强制更新的分支)
    2. 查看 来自远程的分支
  4. 查看master(为了它)

基于 回答冯克.

我需要做同样的事情。这是我的 红宝石 脚本。

#!/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]

我写了这个小 电源外壳 功能能够签出我所有位于远程源的 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 设置存储库

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

故障排除

如果您仍然无法获取主分支以外的任何内容,请检查以下内容:

  • 仔细检查您的遥控器(git remote -v),例如
    • 验证一下 git config branch.master.remoteorigin.
    • 检查是否 origin 通过以下方式指向正确的 URL: git remote show origin (看这个 邮政).

这些答案都没有解决问题,除非用户没有人走在正确的轨道上。

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

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

方法一:

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

方法二:

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

使用您能记住的命令

我正在使用 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

您将在文档中找到有关命令的详细信息:克隆命令, 获取命令, 结账命令

截至2017年初,答案 在这个评论中 作品:

git fetch <origin-name> <branch-name> 为你把树枝拉下来。虽然这不会立即拉出所有分支,但您可以单独执行每个分支。

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

(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

git clone --mirror 原始仓库对此很有效。

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top