Lazy loaded image
字数 0阅读时长 1 分钟
Invalid Date

09. Git working with remotes

添加到远程仓库

步骤1:生成 SSH 密钥
步骤2:添加远程仓库

远程操作命令

场景1:协作 git pull 防止覆盖

场景2:git pull 提示 divergent branches

典型报错
原因
  • 本地分支和远端分支都各自有新提交,历史已经分叉。
  • Git 不知道你希望用 mergerebase,还是只允许 fast-forward 来合并历史。
先查看分叉情况
说明:
  • < 表示本地独有提交。
  • > 表示远端独有提交。
推荐解法:本地提交未共享时使用 rebase
适合场景:
  • 本地提交只是自己的开发提交;
  • 还没有被别人基于这些提交继续开发;
  • 希望提交历史保持线性、干净。
如果 rebase 出现冲突
放弃 rebase:
保守解法:使用 merge
适合场景:
  • 本地提交已经 push;
  • 其他人可能已经基于你的提交继续开发;
  • 不希望改写提交历史。
严格解法:只允许 fast-forward
适合场景:
  • 本地不应该有独有提交;
  • 只接受远端线性更新;
  • 想避免隐式 merge 或 rebase。
什么是 fast-forward
fast-forward 不是创建一次真正的合并提交,而是把本地分支指针直接向前移动。
可以 fast-forward 的情况:
执行:
结果:
本质是:本地没有新提交,只是落后远端,所以 Git 只需要把本地 mainB 移到 D
什么叫不能有本地独有提交
本地独有提交,就是本地分支上有 commit,但远端分支没有。
例如本地领先远端:
这里 C 是本地独有提交。此时通常不是 pull,而是:
更麻烦的是本地和远端同时各自有新提交:
这时 git pull --ff-only 会失败,因为 Git 不能把本地 C 直接快进到远端 E。它们不是一条直线,而是已经分叉。
ff-only 的核心规则
只有当本地当前提交是远端提交历史上的祖先时,才允许 pull。
检查是否能 ff-only
判断:
  • 只有 >:本地只是落后远端,可以 git pull --ff-only
  • 只有 <:本地领先远端,通常应该 git push
  • 同时有 <>:本地和远端已经分叉,需要 rebasemerge
一句话: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:子模块管理

添加子模块
更新子模块
克隆包含子模块的项目
上一篇
Data Structure and Algorithm
下一篇
用面试拷问嵌入式技术栈

评论
Loading...