最近在项目开发中踩了一个 Git 多远端仓库的坑。
现象比较迷惑:
-
同事已经提交了最新代码
-
团队仓库远端确认有更新
-
其他同事都能正常
pull -
但我本地始终看不到最新提交
排查后发现,问题不是远端没有更新,也不是网络问题,而是:
本地分支的 upstream,也就是默认跟踪分支,被改到了自己的私有仓库。
这篇文章记录一下完整问题、原因和解决方案。
一、问题背景
项目中配置了两个远端仓库。
1. 团队仓库
origin
用于团队协作,例如:
origin/main
origin/dev
模拟地址:
https://example.com/company/project-frontend.git
2. 个人私有仓库
personal
用于个人备份或临时同步,例如:
personal/dev
模拟地址:
https://example.com/my/private-project-backup.git
推荐结构如下:
origin = 团队仓库
personal = 个人私有仓库
二、问题现象
执行:
git remote -v
看到两个远端都存在:
personal https://example.com/my/private-project-backup.git (fetch)
personal https://example.com/my/private-project-backup.git (push)
origin https://example.com/company/project-frontend.git (fetch)
origin https://example.com/company/project-frontend.git (push)
看起来一切正常。
继续查看远端分支:
git branch -r
也能看到团队仓库分支:
personal/HEAD -> personal/dev
personal/dev
origin/HEAD -> origin/main
origin/dev
origin/main
origin/feature/demo
这说明团队远端其实能正常访问。
但执行:
git pull
却始终拉不到同事刚提交的最新代码。
三、真正的问题
继续执行:
git branch -vv
发现当前本地分支是这样:
* dev b568141 [personal/dev] feat: example commit message
main 8a89e85 [origin/main] feat: init project
重点是这里:
[personal/dev]
这表示:
当前本地
dev分支跟踪的是personal/dev,而不是origin/dev。
所以执行:
git pull
实际拉取的是:
personal/dev
不是团队仓库的:
origin/dev
因此,团队仓库里即使有最新代码,本地也看不到。
四、为什么会发生?
常见原因是之前执行过类似命令:
git push -u personal dev
这里的 -u 等价于设置 upstream。
它不仅会推送代码,还会把当前本地分支的默认跟踪分支设置为:
personal/dev
于是后续执行:
git pull
git push
默认都会走 personal/dev。
这就是问题根源。
五、解决方案
把本地 dev 分支重新绑定到团队仓库的 origin/dev:
git fetch origin
git branch --set-upstream-to=origin/dev dev
然后再次检查:
git branch -vv
期望看到:
* dev b568141 [origin/dev] feat: example commit message
说明当前本地 dev 已经重新跟踪团队仓库的 origin/dev。
之后再执行:
git pull
或者明确指定:
git pull origin dev
就可以正常拉取团队最新代码。
六、以后怎么正确使用?
拉取团队代码
推荐明确指定团队远端:
git pull origin dev
或者在 upstream 正确的情况下:
git pull
推送到团队仓库
git push origin dev
推送到个人私有仓库
git push personal dev
注意:这里不要加 -u。
不要写成:
git push -u personal dev
否则当前分支 upstream 又会被改到个人私有仓库。
七、快速排查命令
遇到以下情况:
-
同事说已经提交
-
远端分支确实存在
-
自己
git pull却没有变化
第一时间执行:
git branch -vv
重点看当前分支后面的中括号。
错误示例:
* dev b568141 [personal/dev]
正确示例:
* dev b568141 [origin/dev]
八、总结
这次问题的核心不是远端仓库配置错误,而是当前本地分支的 upstream 指错了。
在多远端仓库场景下:
origin = 团队仓库
personal = 个人私有仓库
最好让本地开发分支始终跟踪团队仓库:
origin/dev
个人仓库只作为额外备份目标使用。
尤其要注意:
git push -u
这个命令会修改当前分支的 upstream。
一旦误用到个人仓库,后续直接执行:
git pull
拉取的就可能不是团队代码,而是个人仓库代码。
所以,多远端协作时建议养成习惯:
git branch -vv
先确认当前分支到底跟踪的是哪个远端。

1483

被折叠的 条评论
为什么被折叠?



