rebase xxx_branch 既是 把自己打散了(原分支commit点之后的commit),然后拼接到xxx_branch的最新的commit后面
rebase xxx_branch 以 xxx_branch为基础,从新组装自己,且假设没有冲突,有冲突要解决,rebase后会生成新的commitId
原有的commId不在。
-------------------------------------------------------------------------------------------------------------------
参考:https://www.cnblogs.com/zheroXH/p/11578728.html
--------------------------------------------------------------------------------------------------------------------
rebase 和 merge是 git的两种 合并方式
commit == 快照,两条提交线合并时 只有最后最新的的快照才有冲突的可能。
merge:只会把 另一条线最新的提交和当前线最新的提交并成一个commit 点 ,有冲突解决,其余的commit快照点不管!
rebase: 把当前线拆分了,拼接到rebase的目标branch上来。不生成新的commit点,各自解决冲突。
自己在分支线上开发,同时主线也在不断往前演进着,把主线的修改合并到分支上,做一次集成,此时使用Rebase最好,把自己
所有的修改commitId快照都拆了,都放在 主线修改commitId的头上.
不要在主线上rebase,大家都在用...
.git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git reset --hard xxxxcode(rebase 前的commitid 通过reflog查看)
!总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作
git merge 操作合并分支会让两个分支的每一次提交都按照提交时间(并不是push时间)排序,并且会将两个分支的最新一次commit点进行合并成一个新的commit,最终的分支树呈现非整条线性直线的形式
git rebase操作实际上是将当前执行rebase分支的所有基于原分支提交点之后的commit打散成一个一个的patch,并重新生成一个新的commit hash值,再次基于原分支目前最新的commit点上进行提交,并不根据两个分支上实际的每次提交的时间点排序,rebase完成后,切到基分支进行合并另一个分支时也不会生成一个新的commit点,可以保持整个分支树的完美线性
merge 是把两个最新的commit点,合并成一个commit点,然后放在当前分支,只有这个commit点有可能冲突;
其余的commit点都是在不同分支产生,互不相干。merge不会把目标分支的commit点直接放到当前分支线上,所有commit点都按照时间编排,
而rebase的时候,会把当前分支的所有commit点直接拼接到目标分支线最新的commit点后面,
并且最后把连个分支的最新的commit点,合并成一个commit点。所以时间点是错乱的,
但是这样并没啥问题,其余的commit点都是在不同分支产生,互不相干。只有最后的commit点有可能发生冲突。
git merge xxbranch 是 把不同分支的最新两次提交合并成一次提交。commit 树看起来很乱,但是时间线是顺着来的。
git rebase xxx_branch 不是按照顺序来的。把当前分支的提交commit逐个拆散,然后拼接到目标分支上。各个分支的commit点,在同一条线
但是不掺杂。
$ git checkout mywork
$ git rebase origin
这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。
二、解决冲突
在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:
$ git rebase --continue
这样git会继续应用(apply)余下的补丁。
在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。
$ git rebase --abort