我在GitHub上远程追踪我的master
和development
分支。我该如何同时克隆这两个分支呢?
$ 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
为了在该分支上工作,请创建一个本地跟踪分支,这可以通过以下方式自动完成: To work on that branch, create a local tracking branch, which is done automatically by:
$ 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
注意:这不会创建任何未签出分支的工作副本,这就是问题所问的。要做到这一点,请参见
git pull --all
就可以完成相同的操作——它只不过不会重复抓取。infosec812 是正确的,这并没有回答问题。我想知道这是如何获得这么多赞的。 - Sven Marnach这个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
如往常一样:在复制rm -rf universe之前,请先在您的设置中进行测试,因为我们知道它的意义。感谢用户cfi提供一行代码
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 分支并创建本地跟踪分支。 - cfifor BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
- kgadek使用--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 checkout
,以最终检出已克隆存储库上当前分支的头部。这是一个很好的答案,迄今为止最好的。勇敢一点,最终我们会把你推到顶端 :-) - cfigit clone --mirror
非常适合用于备份您的git代码库 ^_^ - TrinitronX[master]
变成了 [GIT_DIR!]
,最终的 checkout 操作无法完成。更新:我犯了一个错误。我克隆到了 /path/to/dest.git
,而应该是 /path/to/dest/.git
。然后当我取消 bare 模式时,我的 CLI 显示为 [master +0 ~0 -116 ~]
。但是在执行 git checkout master
后,它做了很多工作,最终变成了 [master]
,看起来成功了! - Max Cascone不需要使用复杂的“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 man 页面。
如果没有找到<branch>,但存在恰好一个跟踪分支与之匹配的远程分支(称其为<remote>),则视为等效于
$ git checkout -b <branch> --track <remote>/<branch>
checkout
的分支名称与远程分支的名称相同(即“/”后面的所有内容),那么git将创建一个同名的分支,“跟踪”该远程分支?通过跟踪,我们的意思是:git push
,git pull
等操作将在该远程分支上执行?如果这是正确的,请用更多的信息扩展您的答案,因为我同意@Daniel的观点,这个答案值得更多的声望。 - Gerard Rochegit checkout --track origin/somebranch
。 - dubiousjim关于,
git checkout -b experimental origin/experimental
使用
git checkout -t origin/experimental
git checkout --track origin/experimental
从跟踪远程存储库的角度来看,可能会更好。
使用别名。虽然没有原生的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 bash shell
中设置 alias
,但一旦设置完成,它将在 cmd
和 ps
shells 中工作。这是由于 Windows 中引用、转义和 sed
的可用性差异所致。一旦设置完成,它就可以工作,因为所有的 git 命令都是在 bash
环境中实际执行的。 - Steve Barnesgit branch
显示了原始 git 仓库中所有的 PR。 - fivestones你执行的fetch应该获取所有远程分支,但不会为它们创建本地分支。如果你使用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 checkout -b newlocaldev --track origin/dev
。如果您想让本地分支与远程分支同名,且远程分支名称不复杂,则可以省略-b newlocaldev
。使用默认的branch.autosetupmerge
配置设置,并假设您没有名为dev
的本地分支,这两个命令可能会执行相同的操作:git checkout -b dev origin/dev
和普通的git checkout dev
。最后,git checkout origin/dev
不会创建新分支,而只是使您处于游离HEAD状态。 - dubiousjimgit branch -a
继续将其列为远程分支。 - jww这是最佳的方法:
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 config --unset core.bare
... 对我来说,这似乎是此处所有答案中最干净的解决方案。可惜它没有得到太多的赞... - Dirk Hillbrecht当你执行"git clone git://location"命令时,会拉取所有的分支和标签。
为了在特定的远程分支上进行操作,假设它是origin远程:
git checkout -b branch origin/branchname
$ git branch -a
命令来了解哪些远程分支已经可用。 - Jan Vlcinskygit checkout -b master origin/master
和 git checkout --track origin/master
之间的区别呢? - aderchox
git branch -a
)会展示远程仓库中的分支,但是如果你试图检出它们中的任何一个,你将处于'脱离HEAD'状态。第二个最受赞同的回答回答了另一个问题(即如何拉取所有分支,并且再次强调,这仅适用于你在本地跟踪的分支)。其中一些评论指出,你可以使用shell脚本解析git branch -a
的结果来本地跟踪所有远程分支。总结:没有Git原生方法可以实现你想要的功能,而且也许这并不是一个好主意。 - Day Davis Waterburyscp some_user@example.com:/home/some_user/project_folder ~
不确定这种解决方案是否适用于GitHub... - snapfractalpop