Skip to content

远程追踪分支

远程追踪分支是 Git 在本地维护的远程仓库状态的"快照",帮助你了解远程仓库的状态,无需实时网络连接。

远程追踪分支的概念

当你克隆或 fetch 远程仓库时,Git 在本地创建远程追踪分支,如 origin/main

远程仓库(GitHub):  main → C5
                              ↑ 最新提交

本地远程追踪分支:  origin/main → C3(上次 fetch 时的状态)
本地分支:          main → C4(你的本地提交)

远程追踪分支的格式:<remote-name>/<branch-name>

origin/main      # origin 远程的 main 分支
origin/develop   # origin 远程的 develop 分支
upstream/main    # upstream 远程的 main 分支

重要特点:

  • 你不能直接在远程追踪分支上提交
  • 它们在 git fetch 时自动更新
  • 代表"上次与远程通信时,远程分支的位置"

git branch -r 查看远程分支

bash
# 查看所有远程追踪分支
git branch -r
# origin/HEAD -> origin/main
# origin/develop
# origin/feature/login
# origin/main
# upstream/main

# 查看所有分支(本地 + 远程)
git branch -a
# * main                    ← 本地当前分支
#   develop
#   remotes/origin/main
#   remotes/origin/develop
#   remotes/upstream/main

# 查看远程分支详情
git branch -r -v
# origin/main    a1b2c3d feat: 最新功能
# origin/develop e4f5g6h fix: 修复问题

git branch --set-upstream-to 设置追踪

将本地分支与远程分支建立追踪关系:

bash
# 为当前分支设置追踪
git branch --set-upstream-to=origin/main
git branch -u origin/main     # 简写

# 为指定分支设置追踪
git branch --set-upstream-to=origin/develop develop

# 取消追踪关系
git branch --unset-upstream
git branch --unset-upstream develop

本地分支与远程分支的关系

bash
# 查看追踪关系
git branch -vv
# * main     a1b2c3d [origin/main] feat: 最新功能
#   develop  e4f5g6h [origin/develop: ahead 2, behind 1] fix: 修复
#   local    i7j8k9l (no tracking)  ← 没有追踪关系

# ahead 2:本地比远程多 2 个提交(可以 push)
# behind 1:远程比本地多 1 个提交(需要 pull)
# ahead 2, behind 1:有分叉,需要先合并再推送

创建本地分支并追踪远程分支

bash
# 方式1:checkout 时自动追踪
git checkout -b feature/login origin/feature/login

# 方式2:switch 时自动追踪(推荐)
git switch -c feature/login origin/feature/login

# 方式3:如果远程有同名分支,可以简写
git switch feature/login  # Git 会自动追踪 origin/feature/login

# 方式4:先创建后设置追踪
git switch -c feature/login
git branch -u origin/feature/login

git fetch --prune 清理已删除的远程分支

当远程分支被删除后,本地的远程追踪分支不会自动清除:

bash
# 查看已失效的远程追踪分支(远程已删除)
git remote show origin
# * remote origin
#   ...
#   Local refs configured for 'git push':
#     feature/old-feature pushes to feature/old-feature (gone)  ← gone 表示远程已删除

# 清理本地无效的远程追踪分支
git fetch --prune
git fetch -p          # 简写

# fetch 时默认自动 prune(配置)
git config --global fetch.prune true

手动删除无效的远程追踪分支:

bash
# 删除特定的远程追踪分支(不影响远程,只删除本地记录)
git branch -r -d origin/old-feature
git branch -dr origin/old-feature     # 简写

远程追踪分支的存储位置

bash
# 查看本地存储的远程追踪分支
ls .git/refs/remotes/
# origin/
ls .git/refs/remotes/origin/
# HEAD  develop  main  feature-login

# 查看内容(commit SHA-1)
cat .git/refs/remotes/origin/main
# abc123456789...

实用操作示例

检查与远程的同步状态

bash
# 获取最新状态(不合并)
git fetch

# 查看本地比远程多哪些提交
git log origin/main..HEAD --oneline

# 查看远程比本地多哪些提交
git log HEAD..origin/main --oneline

# 查看两者的差异
git diff HEAD origin/main

从远程分支创建本地分支

bash
# 列出所有远程分支
git branch -r

# 创建对应的本地分支
git switch -c develop origin/develop
git switch -c feature/auth origin/feature/auth

删除本地和远程的分支(配对操作)

bash
# 删除本地分支
git branch -d feature/login

# 删除远程分支
git push origin --delete feature/login

# 清理本地的远程追踪分支记录
git fetch --prune

查看某个远程追踪分支的日志

bash
# 查看远程 main 的提交历史
git log origin/main --oneline

# 查看远程和本地的差异
git log --oneline --graph origin/main HEAD

常见问题

问题:push 时提示 "no tracking information"

bash
# 原因:没有设置追踪关系
# 解决:使用 -u 推送,建立追踪
git push -u origin feature/login

# 或配置全局自动追踪(Git 2.37+)
git config --global push.autoSetupRemote true

问题:本地分支落后于远程

bash
git status
# On branch main
# Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded.

# 解决:更新本地分支
git pull
# 或
git merge origin/main

问题:本地与远程产生分叉

bash
git status
# On branch main
# Your branch and 'origin/main' have diverged,
# and have 1 and 2 different commits each, respectively.

# 解决方案1:合并(产生合并提交)
git pull

# 解决方案2:变基(保持线性历史)
git pull --rebase

# 解决方案3(个人分支):强制推送
git push --force-with-lease

总结

操作命令
查看远程分支git branch -r
查看追踪关系git branch -vv
设置追踪git branch -u origin/<branch>
清理无效追踪git fetch --prune
从远程创建本地分支git switch -c <name> origin/<name>

理解远程追踪分支是理解 fetch/pull/push 背后机制的关键,也是解决各种远程同步问题的基础。