09. Git working with remotes
添加到远程仓库
步骤1:生成 SSH 密钥
步骤2:添加远程仓库
远程操作命令
场景1:协作 git pull 防止覆盖
场景2:git pull 提示 divergent branches
典型报错:
原因:
- 本地分支和远端分支都各自有新提交,历史已经分叉。
- Git 不知道你希望用
merge、rebase,还是只允许fast-forward来合并历史。
先查看分叉情况:
说明:
<表示本地独有提交。
>表示远端独有提交。
推荐解法:本地提交未共享时使用 rebase
适合场景:
- 本地提交只是自己的开发提交;
- 还没有被别人基于这些提交继续开发;
- 希望提交历史保持线性、干净。
如果 rebase 出现冲突:
放弃 rebase:
保守解法:使用 merge
适合场景:
- 本地提交已经 push;
- 其他人可能已经基于你的提交继续开发;
- 不希望改写提交历史。
严格解法:只允许 fast-forward
适合场景:
- 本地不应该有独有提交;
- 只接受远端线性更新;
- 想避免隐式 merge 或 rebase。
什么是 fast-forward:
fast-forward 不是创建一次真正的合并提交,而是把本地分支指针直接向前移动。
可以 fast-forward 的情况:
执行:
结果:
本质是:本地没有新提交,只是落后远端,所以 Git 只需要把本地
main 从 B 移到 D。什么叫不能有本地独有提交:
本地独有提交,就是本地分支上有 commit,但远端分支没有。
例如本地领先远端:
这里
C 是本地独有提交。此时通常不是 pull,而是:更麻烦的是本地和远端同时各自有新提交:
这时
git pull --ff-only 会失败,因为 Git 不能把本地 C 直接快进到远端 E。它们不是一条直线,而是已经分叉。ff-only 的核心规则:
只有当本地当前提交是远端提交历史上的祖先时,才允许 pull。
检查是否能 ff-only:
判断:
- 只有
>:本地只是落后远端,可以git pull --ff-only。
- 只有
<:本地领先远端,通常应该git push。
- 同时有
<和>:本地和远端已经分叉,需要rebase或merge。
一句话:
ff-only 适合“我本地没乱动,只是远端更新了,我跟上去”的场景。只要本地自己提交过,而远端也变了,它就会拒绝。设置默认 pull 策略:
决策表:
情况 | 推荐命令 |
本地提交是自己的,还没共享 | git pull --rebase --tags origin main |
本地提交已经共享,别人可能基于它开发 | git pull --no-rebase --tags origin main |
本地不应该有独有提交 | git pull --ff-only --tags origin main |
想长期默认 rebase | git config --global pull.rebase true |
想长期默认 merge | git config --global pull.rebase false |
核心判断:
如果不确定,用
git fetch + git log --left-right 先看清楚两边提交。不要直接无脑设置 pull.rebase false,那只是让 Git 默认制造 merge commit,历史会越来越脏。场景3:子模块管理
添加子模块:
更新子模块:
克隆包含子模块的项目:






