一、问题描述
有三个分支,dev ,featureTom,featureLucy
dev为公共开发分支,12.20 Tom和Lucy同时拉取代码,进行开发,Lucy先一步提交代码到dev分支,Tom现在需要更新本地代码,并最终提交代码至dev分支
二、更新本地代码featureTom分支
1、暂存本地代码(只有暂存了之后才可以切换分支)
git stash
2、让本地知道远程仓库的状态
git fetch origin
3、切换至featureTom分支
git checkout featureTom
4、把最新 dev 合并进 featureTom
git merge origin/dev
5、恢复你之前的本地修改git stash pop
二、提交 featureTom 分支代码至远程
git add .
git commit
git push
三、更新本地dev分支
git checkout dev
git pull origin dev
有冲突则解决
四、merge featureTom into dev
git merge featureTom
五、其他场景
git stash 主要用于代码没有写完,临时合并其他人的代码
若代码已经写完,则可以直接提交到当前分支的远程分支,再切换到dev分支,更新dev分支到最新状态,merge into dev。会产生一个merge commit的提交记录。
git stash pop 三路合并 即产生冲突的原因
git stash pop 并非简单地“把文件复制回来”,而是执行一次 3-way merge ——
以 s^1 (index 快照)为 base,
s^2 (worktree 快照)为 ours,
当前 HEAD 所指的最新提交为 theirs(指的是本地分支的最新的提交,若pull了那么可能是其他人的修改的代码,可能会产生冲突,和远程分支无关),
三者共同计算差异并应用到当前工作区。
这意味着:如果当前分支在你 stash 之后,其他人推送了 login.js 的新版本,那么 pop 时 Git 会尝试将你 stash 里的 login.js(来自 s^1 )与远程新版本(theirs)做合并,而不是无脑覆盖。
这解释了为什么有时 pop 会触发冲突——不是 stash 出错了,而是你 stash 时的代码基线,已经和当前分支的实际状态产生了不可忽略的偏移。