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

$ git branch
* master

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

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

当前回答

你看不到远程分支,因为你没有跟踪它们。

确保您正在跟踪所有远程分支(或要跟踪的任何分支)。更新本地分支以反映远程分支。


跟踪所有远程分支:

跟踪远程回购中存在的所有分支。

手动执行:

您可以将<branch>替换为gitbranch-r输出中显示的分支。

git branch -r
git branch --track <branch>

使用bash脚本执行:

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

懒惰的方式(由于合并冲突,这可能会造成混乱,请小心):

git checkout master
git pull

更新本地计算机上远程分支的信息:

这将从您正在本地回购中跟踪的远程回购中获取分支的更新。这不会改变您的本地分支。您的本地git回购现在知道远程回购分支上发生的事情。一个例子是,一个新的提交被推送到远程主机,执行一个fetch将提醒您本地主机落后于一个提交。

git fetch --all

更新本地计算机上远程分支的信息并更新本地分支:

对从远程分支到本地分支的所有分支执行一次提取,然后进行一次合并。例如,一个新的提交已被推送到远程主机,执行拉取操作将更新远程分支中的更改的本地回购,然后将这些更改合并到本地分支中。由于合并冲突,这可能会造成相当混乱。

git pull --all

其他回答

只有这三个命令才能获得所有分支:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

你看不到远程分支,因为你没有跟踪它们。

确保您正在跟踪所有远程分支(或要跟踪的任何分支)。更新本地分支以反映远程分支。


跟踪所有远程分支:

跟踪远程回购中存在的所有分支。

手动执行:

您可以将<branch>替换为gitbranch-r输出中显示的分支。

git branch -r
git branch --track <branch>

使用bash脚本执行:

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

懒惰的方式(由于合并冲突,这可能会造成混乱,请小心):

git checkout master
git pull

更新本地计算机上远程分支的信息:

这将从您正在本地回购中跟踪的远程回购中获取分支的更新。这不会改变您的本地分支。您的本地git回购现在知道远程回购分支上发生的事情。一个例子是,一个新的提交被推送到远程主机,执行一个fetch将提醒您本地主机落后于一个提交。

git fetch --all

更新本地计算机上远程分支的信息并更新本地分支:

对从远程分支到本地分支的所有分支执行一次提取,然后进行一次合并。例如,一个新的提交已被推送到远程主机,执行拉取操作将更新远程分支中的更改的本地回购,然后将这些更改合并到本地分支中。由于合并冲突,这可能会造成相当混乱。

git pull --all

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

不更新现有分支的远程跟踪不尝试更新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。

这个答案值得称赞。

|‾‾‾‾‾‾‾‾‾‾‾‾‾fetch/clone‾‾‾‾‾‾‾‾‾‾‾‾↓   |‾‾‾‾‾‾‾‾‾‾‾‾checkout‾‾‾‾‾‾‾‾‾‾↓   
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾pull‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾↓
Remote repository (`origin`) <=> Local repository <=> Index <=> Workspace
↑_________________push_______________|   ↑____commit____|  ↑____add_____| 

# 拉取远程仓库所有分支信息 → 本地仓库
# fetch all remote repository branch meta → local repository
git remote set-branches origin '*'
git fetch -v

# 把所有远程分支数据搞到本地
# fetch all remote repository branch data → local repository
git branch -r | grep -v '\->' | while read remote; do git branch "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

我用这个命令拉动原点分支,git拉动原点