当前位置:   article > 正文

rebase 分支冲突

rebase 分支

莫烦python:https://morvanzhou.github.io/tutorials/others/git/4-3-rebase/

本例的初始文件:https://morvanzhou.github.io/static/results/git/initial-files/for_gitTUT_4-3.zip

 

什么是 rebase

和上节内容一样, 不过我们今天来玩一个更高级的合并方式 rebase. 同样是合并 rebase 的做法和 merge 不一样.

假设共享的 branch 是 branch B, 而我在 branch A 上工作, 有一天我发现branch B已经有一些小更新, 我也想试试我的程序和这些小更新兼不兼容, 我也我想合并, 这时就可以用 rebase来补充我的分支branch B的内容. 补充完以后, 和后面那张图的 merge 不同, 我还是继续在 C3 上工作, 不过此时的 C3 的本质却不一样了, 因为吸收了那些小更新. 所以我们用 C3' 来代替.

rebase åæ¯å²çª

rebase åæ¯å²çª

rebase åæ¯å²çª

rebase åæ¯å²çª

 

可以看出 rebase 改变了 C3 的属性, C3 已经不是从 C1 衍生而来的了. 这一点和 merge 不一样. merge 在合并的时候创建了一个新的 C5 commit. 这一点不同, 使得在共享分支中使用 rebase 变得危险. 如果是共享分支的历史被改写. 别人之前共享内容的 commit 就被你的 rebase 修改掉了.

所以需要强调的是 !!! 只能在你自己的分支中使用 rebase, 和别人共享的部分是不能用 !!!. 如果你不小心弄错了. 没事, 我们还能用在 reset 这一节 提到的 reflog 恢复原来的样子. 为了验证在共享分支上使用 rebase 的危险性, 我们在下面的例子中也验证一下.

 

使用 rebase

初始的版本库还是和上回一样, 在 master 和 dev 分支中都有自己的独立修改.

  1. # 这是 master 的 log
  2. * 3d7796e change 4 in master # 这一条 commit 和 dev 的不一样
  3. * 47f167e back to change 1 and add comment for 1.py
  4. * 904e1ba change 2
  5. * c6762a1 change 1
  6. * 13be9a7 create 1.py
  7. -----------------------------
  8. # 这是 dev 的 log
  9. * f7d2e3a change 3 in dev # 这一条 commit 和 master 的不一样
  10. * 47f167e back to change 1 and add comment for 1.py
  11. * 904e1ba change 2
  12. * c6762a1 change 1
  13. * 13be9a7 create 1.py

当我们想要用 rebase 合并 dev 到 master 的时候:

  1. $ git branch
  2. # 输出
  3. dev
  4. * master
  5. -------------------------
  6. $ git rebase dev
  7. # 输出
  8. First, rewinding head to replay your work on top of it...
  9. Applying: change 3 in dev
  10. Using index info to reconstruct a base tree...
  11. M 1.py
  12. Falling back to patching base and 3-way merge...
  13. Auto-merging 1.py
  14. CONFLICT (content): Merge conflict in 1.py
  15. error: Failed to merge in the changes.
  16. Patch failed at 0001 change 3 in dev
  17. The copy of the patch that failed is found in: .git/rebase-apply/patch
  18. When you have resolved this problem, run "git rebase --continue".
  19. If you prefer to skip this patch, run "git rebase --skip" instead.
  20. To check out the original branch and stop rebasing, run "git rebase --abort".

 

git 发现的我们的 1.py 在 master 和 dev 上的版本是不同的, 所以提示 merge 有冲突. 具体的冲突, git 已经帮我们标记出来, 我们打开 1.py 就能看到:

  1. a = 1
  2. # I went back to change 1
  3. <<<<<<< f7d2e3a047be4624e83c1265a0946e2e8790f79c
  4. # edited in dev
  5. =======
  6. # edited in master
  7. >>>>>>> change 4 in master

 

这时 HEAD 并没有指向 master 或者 dev, 而是停在了 rebase 模式上:

  1. $ git branch
  2. * (no branch, rebasing master) # HEAD 在这
  3. dev
  4. master

所以我们打开 1.py, 手动合并一下两者的不同.

  1. a = 1
  2. # I went back to change 1
  3. # edited in master and dev

然后执行 git add 和 git rebase --continue 就完成了 rebase 的操作了.

  1. $ git add 1.py
  2. $ git rebase --continue

再来看看 master 的 log:

  1. $ git log --oneline --graph
  2. # 输出
  3. * c844cb1 change 4 in master # 这条 commit 原本的id=3d7796e, 所以 master 的历史被修改
  4. * f7d2e3a change 3 in dev # rebase 过来的 dev commit
  5. * 47f167e back to change 1 and add comment for 1.py
  6. * 904e1ba change 2
  7. * c6762a1 change 1
  8. * 13be9a7 create 1.py

!! 注意 !! 这个例子也说明了使用 rebase 要万分小心, 千万不要在共享的 branch 中 rebase, 不然就像上面那样, 现在 master 的历史已经被 rebase 改变了. master 当中别人提交的 change 4 就被你无情地修改掉了, 所以千万不要在共享分支中使用 rebase.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/775050
推荐阅读
相关标签
  

闽ICP备14008679号