如何让已有的本地分支跟踪远程分支
设置跟踪关系:git branch --set-upstream-to=origin/<远程分支> <本地分支>;推送时顺便设置用 git push -u origin <分支>。设好后 git status 可显示相对上游的领先/落后,裸 push 是否可用仍取决于推送配置。
一条命令:git branch --set-upstream-to=origin/远程分支 本地分支名。推送的同时设置也行:git push -u origin 分支名。上游用于 pull 和 ahead/behind 计算;裸 push 还受 push.default、pushRemote 等配置影响,并不保证可推。
设置跟踪
# 站在该分支上
git branch --set-upstream-to=origin/feature-x
# 或指定本地分支名
git branch --set-upstream-to=origin/feature-x feature-x
# 推送时一步搞定
git push -u origin feature-x
验证
git branch -vv
# * feature-x a1b2c3d [origin/feature-x: ahead 1] 提交说明
git status
# Your branch is ahead of 'origin/feature-x' by 1 commit.
ahead/behind 是相对本地保存的远程跟踪引用计算,远端有新提交时需先 fetch 更新。
修改与取消
git branch --set-upstream-to=origin/another-branch # 改跟踪目标
git branch --unset-upstream # 取消跟踪
常见问题(FAQ)
Q:设置时报 "no such branch"?
远程还没有这个分支(或没 fetch)。先检查 fetch refspec 是否包含目标并 git fetch,或 git push -u origin 分支名 顺带创建。
Q:本地和远程分支名不一样能跟踪吗?
能,--set-upstream-to 的两边名字随意对应。但 push.default=simple 在本地/上游名字不同等情形会拒绝裸 push,可显式给 refspec。
Q:checkout 远程分支自动建跟踪是什么原理?
那是 Git 的 DWIM 行为:git checkout feature-x 发现本地没有、远程跟踪引用恰好有唯一匹配(或 checkout.defaultRemote 消除歧义),就自动 checkout -b + 跟踪。手动设 upstream 是当自动机制不适用(多远程、不同名)时的手段。