我有一个master
和一个development
分支,都推到了GitHub.我clone
ð,pull
ED和fetch
ED,但我仍然无法获得比其他任何master
分支回来.
我确定我错过了一些明显的东西,但是我已经阅读了手册,而且我一点也不开心.
首先,克隆一个远程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'
最后一行引发了一些人:"新分支" - 是吧?它的真正含义是从索引中获取分支并在本地为您创建.在前面的行实际上是因为它会告诉你该分支正在建立跟踪远程分支,这通常意味着起源/ 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
现在,您可以根据需要签出任何分支,而无需访问远程存储库.
这个Bash脚本帮助了我:
#!/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 FAQ:如何使用所有远程跟踪的分支克隆存储库?
您可以轻松切换到分支,而无需使用花哨的"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手册页:
如果找不到
但是在一个具有匹配名称的远程(称为 )中确实存在跟踪分支,则视为等效于 $ git checkout -b--track /
关于,
$ 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/
通过以下命令验证您是否在所需的分支中;
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
即使您只看到master分支,也可以使用"git branch -a"查看所有分支.
git branch -a
你可以切换到你已经拥有的任何分支.
git checkout
不要担心,在你"git clone"之后,你不需要连接远程仓库,当你关闭wifi时,"git branch -a"和"git checkout"可以成功运行.所以事实证明,当你进行"git clone"时,它已经从远程仓库中复制了所有分支.之后,您不需要远程仓库,您的本地已经拥有所有分支机构的代码.
A git clone
应该复制整个存储库.尝试克隆它,然后运行git branch -a
.它应列出所有分支.如果那时你想切换到分支"foo"而不是"master",请使用git checkout foo
.
使用我的工具git_remote_branch(你需要在你的机器上安装Ruby).它专门用于使远程分支操作变得容易.
每次代表您执行操作时,它都会在控制台上以红色打印.随着时间的推移,他们终于坚持到你的大脑:-)
如果您不希望grb代表您运行命令,只需使用'explain'功能即可.这些命令将打印到您的控制台,而不是为您执行.
最后,所有命令都有别名,以便更容易记忆.
请注意,这是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
我在这里看到的所有答案都是有效的,但有一种更清晰的方法来克隆存储库并立即拉出所有分支.
克隆存储库时,实际下载了分支的所有信息,但隐藏了分支.用命令
$ git branch -a
您可以显示存储库的所有分支,并使用该命令
$ git checkout -b branchname origin/branchname
然后,您可以一次手动"下载"它们.
但是,当你想要克隆一个包含很多分支的repo时,所有上面说明的方式都是冗长乏味的,这是我要展示的更清洁,更快捷的方式,尽管它有点复杂.您需要三个步骤来完成此任务:
第一步
在您的计算机上创建一个新的空文件夹,并从存储库中克隆.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"命令.
第二步
通过将git配置的布尔值"裸"切换为false,将此存储库从空(裸)存储库切换到常规存储库:
$ git config --bool core.bare false
第三步
抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的repo.
$ git reset --hard
所以现在你可以输入命令"git branch",你可以看到所有的分支都被下载了.
这是您可以快速克隆包含所有分支的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
还创建了下面的图像,以简化我所说的内容:
#!/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
检查主人(这样我们就可以删除我们所在的分支)
选择远程结帐(将其更改为您拥有的任何远程)
循环遍历除master和HEAD之外的所有远程 分支
删除本地分支(以便我们可以检查强制更新的分支)
从远程检查分支
看看大师(为了它)
基于答案的VonC.
我写了这个小的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' #> }
在我的git设置repo上可以找到更多git函数
我需要完全一样.这是我的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]
这些答案都没有削减它,除非用户没人在正确的轨道上.
将repo从一个服务器/系统移动到另一个服务器/系统时遇到了麻烦.当我克隆了repo时,它只为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
Git通常(未指定时git ls-refs
)从一个或多个其他存储库中获取所有分支和/或标记(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.remote
是origin
.
通过以下方式检查是否origin
指向正确的URL :( git remote show origin
请参阅此帖子).
git clone --mirror
在原始回购上可以很好地做到这一点。
git clone --mirror /path/to/original.git git remote set-url origin /path/to/new-repo.git git push -u origin
这是使用awk的答案。如果在新的仓库上使用该方法就足够了。
git branch -r | awk -F/ '{ system("git checkout " $NF) }'
现有分支将仅被检出或声明为已经存在,但是可以添加过滤器以避免冲突。
也可以对其进行修改,以便调用显式git checkout -b
命令。
该答案遵循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
。
这是另一个简短的单行命令,它为所有远程分支创建本地分支:
(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
我正在使用Bitbucket,一个Atlassian的存储库托管服务.所以我试着关注他们的文档.这对我来说非常有效.使用以下简单和简短命令,您可以检出远程分支.
首先克隆您的存储库,然后切换到目标文件夹.最后但并非最不重要的是获取和结帐:
git clonecd git fetch && git checkout
而已.这里有一个更真实的例子:
git clone https://username@bitbucket.org/team/repository.git project_folder cd project_folder git fetch && git checkout develop
您将在docs中找到有关命令的详细信息: Clone Command,Fetch Command,Checkout Command
截至2017年初,本评论的答案有效:
git fetch
为你带来了分支.虽然这不会立即拉出所有分支,但您可以单独执行此分支.