Appearance
远程追踪分支
远程追踪分支是 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/logingit 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 背后机制的关键,也是解决各种远程同步问题的基础。