git fetch 最安全,只下载不合并;fetch 后用 git log ..origin/branch 预览提交,再用 git checkout -b branch origin/branch 创建跟踪分支;清理失效远程引用用 git remote prune origin。

git fetch 只拉代码不合并,这是最安全的起点
直接 git pull 会自动 merge 或 rebase,一旦远程分支有冲突或历史重写,本地当前分支立刻被污染。fetch 是纯粹“下载元数据+对象”,不碰你的工作区和暂存区,适合先确认内容再决定怎么用。
- 运行
git fetch origin feature/login就能只拉取远程feature/login分支的最新提交,不会影响你当前在哪个分支 - fetch 后用
git log ..origin/feature/login可以预览这个分支新增了哪些提交,比直接 pull 更可控 - 如果远程分支名含斜杠(如
release/v2.1),必须加引号或转义:git fetch origin 'release/v2.1',否则 shell 可能报错或解析失败
git checkout -b 基于远程分支新建本地分支
fetch 完之后,远程分支只是存在 origin/xxx 这种“远程追踪引用”里,你还不能直接 git checkout origin/xxx(那会进入分离头指针状态)。真正想在本地开发,得新建一个跟踪分支。
- 推荐命令:
git checkout -b feature/login origin/feature/login—— 一步创建本地分支并设置 upstream - 等价但更显式的写法:
git switch -c feature/login --track origin/feature/login(Git 2.23+) - 别用
git checkout origin/xxx,它会让你卡在 detached HEAD,后续 commit 不属于任何分支,容易丢失 - 如果本地已存在同名分支且不想覆盖,
git checkout会拒绝,这时得先git branch -D feature/login或换名
git pull --no-commit 拉取并暂停合并,方便检查再决定
有些场景你确实想快速更新当前分支(比如正在开发的 dev),又怕自动 merge 出问题。这时候 --no-commit 能帮你把合并过程“卡住”,留出检查窗口。
-
git pull --no-commit origin dev会执行 fetch + merge,但不自动 commit,所有变更停留在暂存区 - 此时可以
git status看冲突文件,git diff --cached看即将提交的内容,甚至git reset --hard全部回退 - 注意:这个参数对 rebase 模式无效(
git pull --rebase本身就不 commit),也不适用于已配置pull.rebase=true的仓库 - 如果远程分支被 force push 过,
git pull可能拒绝合并,这时必须先git fetch再手动git reset --hard origin/dev
远程分支删了,本地还留着?用 git remote prune 清理
团队协作中,别人删掉 feature/old 后,你的 origin/feature/old 追踪引用并不会自动消失。下次 git branch -r 还能看到它,但 git fetch 也不会更新它——它成了“僵尸引用”。
- 清理命令:
git remote prune origin,它会删掉所有在远程已不存在的origin/xxx - 想预览将删哪些,加
--dry-run:git remote prune --dry-run origin - 也可以让 fetch 默认自动 prune:
git config --global fetch.prune true,但要注意这会影响所有仓库 - 别依赖
git fetch --prune一次性的写法,因为有些 CI 工具或脚本里没加这个 flag,久而久之本地引用就积灰
远程分支名大小写、特殊字符、空格都可能引发 shell 解析或 Git 内部处理异常;最稳妥的做法是始终用单引号包裹分支名,哪怕它看起来“很安全”。










