Git必知必会底子(10):当地辩论(conflicts)解决--rebase

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

本系列汇总,请查察这里:https://www.cnblogs.com/uncleyong/p/10854115.html
  关于rebase

  rebase用来变基,就是重新定义(re)出发点(base)的作用,即重新定义分支的版本。
  在执行变基的过程中,三个常用下令:
   
  1. git rebase --skip 它表示丢弃当前补丁的重放,即忽略掉当前补丁
  2. git rebase --abort 它表示终止正在进行的变基操作,并且恢复到最初始的状态
  3. git rebase --continue 它表示继续补丁的重放,一般在解决冲突后执行该命令
复制代码
   演示场景

  在合并分支过程中,可能会遇到辩论,本篇演示用rebase解决当地辩论。
  基于master主分支,创建两个开发分支dev_a和dev_b,分别做修改:
  dev_a第一次修改并提交到当地仓库,然后推送到远程仓库
dev_b第一次修改并提交到当地仓库,然后推送到远程仓库
dev_a第二次修改并提交到当地仓库,然后推送到远程仓库
dev_b第二次修改并提交到当地仓库,然后推送到远程仓库
  先合并dev_a:切换到dev_a,rebase master分支,没有辩论,然后切换到master,举行merge
  然后合并dev_b:切换到dev_b,rebase master分支,产生辩论,解决辩论,然后切换到master,举行merge,最后push到远程master分支
  准备数据 

  远程数据
  

  远程commit id
  

  克隆到当地
  

  文件内容
  

  创建dev_a分支
  

  修改qzcsbj.txt内容,然后提交到当地仓库
  

  切换到master,创建dev_b分支
  

  修改qzcsbj.txt内容,然后提交到当地仓库
  

  再次切换到dev_1做一次提交,然后推送到远程仓库
  

  再次切换到dev_2做一次提交,然后推送到远程仓库
  

  远程分支内容
  

  

  

  合并分支并解决辩论

  切换到master,拉取最新master
  

  先合并dev_a,下面没有辩论,变基乐成并更新refs/heads/master
  

  

  切换到master举行merge
  

  push到远程
  

  然后合并dev_b分支,产生辩论,辩论文件是qzcsbj.txt
  

  也可以这样查察辩论的文件:git diff --name-only --diff-filter=U
  

  查察分支差异:git diff master dev_b
  

  辩论文件内容:
  

  HEAD(ef2d957)体现dev_b第一次提交
  

  修改辩论文件
  

  add
  

  继续rebase
  

  

  第一行改为:
  

  保存退出后的结果:天生的新提交id是bd16a7c
  

  依然有辩论,HEAD(bd16a7c)体现dev_b第二次提交
  

  辩论文件内容:
  

  修改辩论文件,然后add
  

  继续rebase
  

  

  第一行改为:
  

  保存退出,结果:变基乐成并更新refs/heads/master
  

  文件内容:
  

  切换到master,执行merge
  

  master送到远程仓库
  

  假如dev_b在合并前做了许多次commit,那么就要处理许多次辩论,每次解决后执行git rebase --continue
  对于单条分支,rebase可以或许合并多个commit,将多个提交合并成一个提交,下令是:
   
  1. git rebase -i [commit id]
复制代码
   合并commit id之前的全部commit;-i选项可以或许提供一个交互界面,分阶段修改commit信息并rebase。
  查察分支合并图

  git log --graph --oneline
  

  

  git log --graph
  

  
 
  结论:会修改提交历史,无法直观地看出哪些提交是在原分支上完成的,历史记录是一条直线(线性),会显得更为整洁,合并图更易读
  分支后续操作

  此时分支假如不要了就可以删除
  假如要继续在分支在开发,需要同步master分支,rebase即可:
   
  1. 切换到对应分支,使远程库和本地库同步:git pull --rebase origin master
  2. 如果有冲突忽略冲突(丢弃当前补丁的重放,即忽略掉当前补丁):git rebase --skip
  3. 如果有冲突,强制推送:git push -f origin 当前分支名,如果没有冲突:git push origin 当前分支名
复制代码
   这里基于dev_a分支演示
  当地
  

  远程
  

  无辩论

  rebase远程master分支
  

  

  推送dev_a到远程分支
  

  远程分支内容
  

  commit id和主分支的一样
  

  有辩论

  修改dev_a分支文件内容,并推送到远程分支
  

  切换到master
  

  修改master分支文件内容,然后推送到远程
  

  切换到dev_a分支,rebase远程master,出现辩论
  

  丢弃当前补丁的重放,即忽略掉当前补丁,变基乐成并更新refs/heads/master
  

  文件内容和master一样
  

  dev_a远程内容
  

  push到远程,报错
  

  强制push到远程
  

  远程分支内容
  

  commit id和master一样
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表