我克隆了一个包含许多分支的Git存储库。然而,git分支仅显示一个:

$ git branch
* master

我如何在本地拉所有分支,所以当我执行git分支时,它会显示以下内容?

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

当前回答

如果您这样做:

git fetch origin

然后他们都会在当地。如果随后执行以下操作:

git branch -a

您将看到它们列为remotes/origin/分支名称。因为他们在当地,你可以随心所欲地和他们在一起。例如:

git diff origin/branch-name 

or

git merge origin/branch-name

or

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

其他回答

git remote add origin https://yourBitbucketLink

git fetch origin

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

现在本地您的NewLocalBranchName是您所需的RemoteBranch。

如果您在fetch-all方面遇到问题,请跟踪远程分支:

git checkout --track origin/%branchname%

以下是我认为可靠的东西:

不更新现有分支的远程跟踪不尝试更新HEAD以跟踪原点/HEAD允许命名为非原点的远程正确引用外壳

for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

不需要git fetch,因为将all传递给git pull会将此选项传递给内部fetch。

这个答案值得称赞。

太长,读不下去了为每个远程跟踪分支创建一个本地分支可能是个坏主意。这些不同类型的分支机构用于不同的目的,通常根据其需要创建本地分支机构。gitbranch显示本地分支gitbranch-r显示远程跟踪分支。gitbranch-a同时显示两者。您可以使用适当的fetch命令更新所有远程跟踪分支。这通常是你所需要的。


滚动浏览现有答案后,我发现有两种:一种是简单地回答问题,而不是建议不同的方法。而那些建议了一种不同的方法,但没有解释原因。这是我想再解释一点的地方。

通常的git存储库实际上需要处理三种分支。这三种分支有不同的用途。简而言之:

远程分支:这些是存在于远程存储库中的分支。您永远不会直接从远程分支读取。所有远程分支的读取都是通过git进行的,称为“远程跟踪分支”远程跟踪分支:git保存远程分支的本地快照,最准确的说法是“远程跟踪分支”。当您调用git fetch或git pull(执行fetch)时,它们会更新。您通常可以使用远程跟踪分支,而无需创建本地分支。例如:git合并原始/主将远程跟踪分支原始/主分支合并到当前本地分支,而无需先创建其本地副本。这意味着:有一个名为origin/master的远程跟踪分支,它是名为master的分支的快照,因为它存在于名为origin的远程存储库中。此命令将其合并到当前签出的本地分支中。在执行类似操作之前,您可能需要执行一次提取。本地分支:这些是历史上某些点的手动创建的快照(通常至少首先基于远程跟踪分支)。它们比其他类型静态得多,只有在手动更改它们时才会真正更改。逐一地。如果希望在工作树(项目目录)中查看其内容,或者希望向其添加提交,则可能需要本地分支。

一旦你完成了本地分支机构(并发布了其内容),你可以考虑删除它。这样你就不需要保持它的最新状态。毕竟,fetch不会更新当前本地分支,pull只会更新当前签出的本地分支。换言之:您应该只在需要时创建本地分支,而在不再需要时可能应该删除它们。

说“某些分支默认隐藏”可能不准确。相反,创建gitbranch命令是为了显示“本地分支”。您可以使用gitbranch-r列出远程跟踪分支,使用gitbranch-a显示本地分支和远程跟踪分支。这两种不同类型的分支用于不同的目的,您不可能需要为每个远程跟踪分支设置本地分支。

还要注意,创建本地分支通常是一个坏主意,其名称以远程的名称开头,后跟斜杠(例如,创建一个名为“origin/master”的本地分支往往是一个糟糕的主意,因为它的名称与远程跟踪分支的名称冲突)。

在更新分支的上下文中,讨论不同风格的fetch命令是有意义的:

gitfetch:仅更新远程跟踪分支,这些分支的远程与当前签出分支的“上游”中使用的分支相匹配。如果签出的分支没有上游集合,则返回到从名为“origin”的远程获取(如果存在)。这个命令是最简单的,并且在大多数时间都足够了。gitfetch--all:更新所有远程跟踪分支,而不管它们属于哪个远程。

我特别喜欢

git fetch -tf --all

它还将始终更新(并在需要时覆盖)所有标记,包括无法从远程分支访问的标记。

下面是接受答案中提供的一行程序的Perl版本:

git branch-r | perl-e'while(<>){chop;my$remote=$_;my($local)=($remote=~/origin\/(.*)/);打印“git branch--track$local$remote\n”;}'>一些输出文件

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

我们无意中删除了Stash项目存储库。幸运的是,就在意外损失之前,有人制造了一个叉子。我将叉子克隆到了我的本地(将省略我是如何做到这一点的细节)。当我把叉子完全放在本地时,我跑了一条单行道。我修改了远程服务器的URL(在我的例子中是源URL),以指向我们要恢复到的目标存储库:

gitremoteseturl-origin<remoteurl>

最后将所有分支都推到原点,如下所示:

git push—所有原点

我们又回到了生意上。