外观
git pull 和 rebase 怎么选?
pull 是先把远程提交取下来,再和当前分支合并。默认合并会多一个合并提交。rebase 把你的本地提交挪到目标分支的最新提交之后,历史是一条线。已经推送并给别人用过的提交,不要 rebase。
原理
fetch 只更新远程跟踪分支,不改你正在写的分支。pull 等于 fetch 再合并。想看清远程有什么,先 fetch,再决定合并还是 rebase。
合并保留「这两支曾经分开」的事实,冲突在一次合并提交里解决。rebase 逐个重放你的提交,冲突可能在每一个被重放的提交上出现,历史更直,但提交哈希都变了。
共享分支上 rebase 之后要强推,别人基于旧哈希的工作会对不上。功能分支还没合并、只有你在用,可以用 rebase 把提交整理到主分支最新位置之后。
stash 把工作区暂存起来,用来临时切走。它不是提交,弹回来时仍可能冲突。
追问
冲突怎么解?
两边改了同一处,Git 标记出区域。决定要留下的内容,删掉标记,再加入索引并继续合并或 rebase --continue。不要把标记符提交进去。看不懂时先 diff 两边的意图,而不是选「用我的」盖掉对方。
reset 和 revert 呢?
reset 移动分支指针,已经推送的历史会被改写。revert 新增一个提交,用来撤销旧提交的效果,适合已经共享的历史。--soft 只动分支指针,暂存区和工作区还在。--mixed 还清空暂存区。--hard 连工作区一起丢掉,没提交的修改找不回来。
易错点
- 在主分支上 rebase 再强推。
pull之前有一半修改没提交也没 stash,仓库进入冲突状态却不知道哪些文件是自己的。- 用
reset --hard清掉还没提交的修复。