git fetch --all 仅下载远程更新而不修改本地分支,需手动用 merge 或 reset 同步;未建立追踪关系的远程分支不会自动创建本地分支;避免使用不可靠的一键同步脚本。

git fetch --all 只下载,不更新本地分支
这是最常被误解的一步:运行 git fetch --all 后,你看到 origin/feat/login、origin/main 等远程引用确实更新了,但你的本地分支(比如 feat/login)仍然指向旧 commit。它只是把远程最新状态“存下来”,没动你当前工作区,也没改任何本地分支指针。
这恰恰是安全的设计——避免误覆盖未提交修改或自动触发冲突。但很多人误以为“拉完了”,结果切过去发现代码还是老的。
- 检查是否真同步了:运行
git branch -vv,如果某行显示[origin/xxx: behind 3],说明本地分支落后,但远程引用已知新状态 - 想看远程到底多了啥:用
git log origin/xxx..xxx对比本地和远程追踪分支差异 - 别用
git pull --all:Git 压根不支持这个参数,会报错unknown option `--all`
让本地分支对齐远程:reset --hard 还是 merge?
选哪个,取决于你是否要保留该分支上的未推送提交。二者策略完全不同,混用会导致丢代码或引入意外冲突。
- 用
git checkout xxx && git reset --hard origin/xxx:强制让本地分支完全等于远程对应分支,所有未git push的本地 commit 都会被丢弃 - 用
git checkout xxx && git merge origin/xxx:尝试合并远程新提交,保留本地变更,但可能产生冲突,需手动解决 - 先确认追踪关系:
git branch -vv中若没显示[origin/xxx],说明该本地分支还没关联远程,得先git branch --set-upstream-to=origin/xxx xxx
批量创建本地分支以跟踪所有远程分支
如果你本地还没有 dev、release/2.1 这类分支,只靠 git fetch --all 是不会自动生成的。必须显式创建并建立跟踪关系。
通用Git项目监控工具,支持GitHub、GitLab、Gitee等平台。可增删仓库、检查更新、自动拉取代码并生成变更摘要。用于“监控项目”“检查更新”“添加仓库”等场景。
推荐用这一行脚本(在仓库根目录执行):
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
它会遍历所有 origin/* 分支,自动去掉前缀创建同名本地分支,并设置好追踪。注意:
- 若远程名不是
origin(比如叫upstream),需把脚本里的origin/和origin全部替换成对应名字 - 如果本地已有同名分支,
git branch --track会失败,得先手动处理重名 - 执行后用
git branch -a验证:应同时看到remotes/origin/xxx和xxx
别信“一键同步所有分支”的自动化脚本
网上很多所谓「全自动更新全部本地分支」的 shell 脚本,实际在协作环境中极易出事。它们通常假设你每个分支都干净、无冲突、无未暂存修改——现实几乎从不满足。
- 遇到未暂存修改时,
git checkout直接失败,脚本中断,部分分支根本没更新 - 某个分支
merge出现冲突,脚本卡住,后续所有分支跳过 - 变量名写错(比如把
$remote写成$branch),可能把main强制重置成origin/dev,后果严重
真正可控的做法是:先 git fetch --all,再按需逐个处理关键分支,用 git status 和 git branch -vv 看清状态再动手——省下的那两分钟,可能换来半天找丢失的提交。

















