河南宝盈建设工程有限公司网站,房地产建设网站,网站开发多少人,少儿编程线下培训机构排名前十rebase介绍
一、背景
远程仓库有oh4w-dev和oh4k-dev两个分支#xff0c;oh4k-dev是基于oh4w-dev开发到80%的代码新拉的分支#xff1b;此后两条分支同步开发#xff0c;当oh4k-dev开发完成#xff0c;oh4w-dev还在开发阶段#xff0c;oh4k-dev需要拉取到oh4w-dev自分出o…rebase介绍
一、背景
远程仓库有oh4w-dev和oh4k-dev两个分支oh4k-dev是基于oh4w-dev开发到80%的代码新拉的分支此后两条分支同步开发当oh4k-dev开发完成oh4w-dev还在开发阶段oh4k-dev需要拉取到oh4w-dev自分出oh4k-dev后的最新提交。
二、git pull VS git rebase
有两种方法git pull和git rebase。
git pull
git pull其实是git fetch和git merge的组合
当执行git pull时相当于执行了git fetch从远程仓库拉取最新代码、git merge将拉取的最新代码和本地代码合并
使用git pull虽然在存在冲突时会多出无意义的一条提交记录“Merge…to…”但能清楚地知道当前分支上谁合了代码以及合代码的时间先后顺序
git rebase
git rebase则是将当前分支的提交历史建立在指定分支上的和当前分支的公共祖先节点的最新提交上不论提交的时间先后顺序
三、选择git rebase的理由
目前的情况使用git rebase更加合适因为oh4w-dev仍然在开发过程中即使使用git pull合并一次代码下次oh4k-dev再次拉取oh4w-dev最新代码时上次合并过的冲突还需要重复处理而使用git rebase合并一次提交历史oh4w-dev和oh4k-dev的提交记录的公共祖先节点已经更新了无需再处理一遍上次处理过的冲突
四、使用git rebase遇到的问题
问题一
本地仓库中与远程分支oh4w-dev和oh4k-dev对应的分支分别是local-oh4w-dev和local-oh4k-dev
站在local-oh4k-dev分支使用git rebase local-oh4w-dev拉取local-oh4w-dev的最新提交历史很幸运没有冲突但在执行git push --force-with-lease进行强制提交时终端报错
分析了一下原因是因为这个项目在git push提交修改到Gerrit远程仓库时每次提交都需要携带Change-IdChange-Id是Gerrit等代码审查工具用来跟踪提交的唯一标识符如果Gerrit判断推送的变基后的提交历史中包含已经被合并到主分支或已经关闭的修改即存在相同的Change-Id则会导致提交被拒绝
还有一点推送的远程分支是Gerrit中的refs/for/branch这是一个特殊的引用命名空间用于接受代码审查的推送Gerrit不会像传统分支那样检查其状态而git push --force-with-lease的核心逻辑是检查远程分支的当前状态是否与本地引用的远程分支状态一致所以git push --force-with-lease对refs/for/oh4k-dev是无效的与普通的git push几乎相同
解决方法 如果Change-Id冲突可以重新生成新的Change-Id 如果是单个commit记录 1.使用git commit --amend修改提交记录 2.删除旧的Change-Id 3.esc退出编辑模式 4.输入:wq保存 5.Git会自动生成一个新的Change-Id 6.git push origin local-oh4k-dev:refs/for/oh4k-dev将本地的变更推送到远程 如果有多条提交记录需要修复可以使用交互式变基 1.使用git rebase -i HEAD~n选择最新的n条commit记录进入编辑模式 2.输入i开启编辑操作 3.将需要修改的提交记录的pick改为edit 4.esc退出编辑模式 5.输入:wq保存 6.在每一条提交记录处停留用处理单个提交记录的方式处理 7.每处理完一条执行git rebase --continue直到变基结束 8.git push origin local-oh4k-dev:refs/for/oh4k-dev将本地的变更推送到远程
问题二
变基结束将本地合并后的提交历史上传到远程意味着之前在local-oh4k-dev上提交过的修改需要重新提交一次可能会存在冲突
解决方法 1.使用git rebase -i HEAD~n启动交互式变基 2.修改第一条提交之外的状态为fixup自动合并修改但丢弃提交信息或squash自动合并修改且允许修改提交信息 3.如果产生冲突解决完冲突后git add .git rebase --continue继续变基 4.变基结束git commit --amend生成新的Change-Id 5.最后git push origin local-oh4k-dev:refs/for/oh4k-dev推送本地变更
问题三
本地的提交历史由于进行了rebase已经改变而git push不会覆盖远程仓库的提交历史只是新增了刚刚push上去的新的变更所以本地的提交历史和远程仓库还是不一致的可以通过git reset --soft origin/oh4k-dev将两者进行同步
思考 这样一条一条提交记录去删除记录较少的情况下还好处理一旦数据量过大很浪费时间看看可以不可以一键删除