[整理]git rebase的用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TTKatrina/article/details/79288238

使用git版本管理工具,必问git rebase的用法,但之前项目组人数5人,一直使用的是git pull,git commit 和git push,几乎没有用git rebase来变基,减少难看的merge 类型的commit。
最近一个新项目,两地合作办公大概有10人共用一个项目分支,几分钟内可能有多人提交,造成连续多个merge在gitk的路径中,看不清某个人某次有价值的提交是哪一条,故组长建议大家使用git rebase。

看了2015年多个博客,前人栽的树,整理如下,方便新人查看。


merge和rebase解决冲突的差别图不贴了,主要是新使用的时候不知道写什么命令行。
命令行的使用直接上代码,git rebase 替代 git merge 大致过程:

git stash
git pull —rebase
git stash pop
手动解决冲突
git add -u
git rebase —continue
如果此时提示No rebase in progress?则表示已经没有冲突了;否则上面两步要重复多次
git commit -m “xxx”
git push origin [branch] -f

附录前人博客链接:
简单对比git pull和git pull –rebase的使用

[精华部分]使用下面的关系区别这两个操作:
git pull = git fetch + git merge
git pull –rebase = git fetch + git rebase

(附图解)git pull –rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法

很喜欢如下图:
这里写图片描述

git pull –rebase 理解
这个命令做了以下内容:
a.把你 commit 到本地仓库的内容,取出来放到暂存区(stash)(这时你的工作区是干净的)
b.然后从远端拉取代码到本地,由于工作区是干净的,所以不会有冲突
c.从暂存区把你之前提交的内容取出来,跟拉下来的代码合并
所以 rebase 在拉代码前要确保你本地工作区是干净的,如果你本地修改的内容没完全 commit 或者 stash,就会 rebase 失败。

还附上了git add -u的解释:

git add 的几种参数区别:
git add -A 保存所有的修改
git add . 保存新的添加和修改,但是不包括删除
git add -u 保存修改和删除,但是不包括新建文件。
如果只想提交某个文件,可以使用git add 路径/文件名 或者 git add 路径/

git rebase 使用详解

这一篇解释了手动解决冲突时<<<<和=====的含义
一般情况下rebase都是会有冲突的,详细查看冲突可以用命令git status然后就会显示哪个文件有冲突,然后打开有冲突的哪个文件,会发现有一些“<<<<<<<”, “=======”, “>>>>>>>” 这样的符号。

<<<<<<<” 表示冲突代码开始

“=======” 表示testmaster冲突代码分隔符

“>>>>>>>" 表示冲突代码的结束

<<<<<<<  
所以这一块区域test的代码

=======  
这一块区域master的代码

>>>>>>> 

对于rebase的工作流以代码的形式也体现的很清楚:

git rebase 
while(存在冲突) {
    git status
    找到当前冲突文件,编辑解决冲突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

除去替代merge,git rebase还有合并多个commit的功能,如下取自知乎:
(知乎)git rebase有哪些用法?
原文似乎不乐意被转载,简单记录如下,明细还是看原帖子。还没试验过,先记录如下:

两种经典用法
问题场景1.如何删除历史中某项提交?
【案例】去除提交列表中的某个commit,例如在master分支上A->B->C->D->E->F, 除去D。
方案一:
git checkout C //将HEAD切换到C提交
git cherry-pick master^ //master^即E,将E放在C后面,E的HSA1值改变
git cherry-pick master //master即F,将F放在E后面,F的HSA1值改变
git checkout master //将HEAD切换到master分支
git reset –hard HEAD@{1} //将HEAD切换到最新的F
方案二:
采用变基的方式
git rebase –onto C E^ F //前后开闭区间,E^即D,表面C后面加上(D,F]
git checkout master
git reset –hard HEAD@{1}
方案三:
交互式变基
git rebase -i D^
然后删除第一行(?没明白意思)

问题场景2.如何合并历史提交?
【案例】在master分支上A->B->C->D->E->F, 合并D到C,即A->B->CD->E->F。
方案一:
git checkout D
git reset –soft HEAD^^
git commit -c C//-c表示重用C的提交信息
git cherry-pick E
git cherry-pick F
git checkout master
git reset –hard HEAD@{1}
方案二:
用变基命令
git checkout D
git reset –soft HEAD^^
git commit -c C//-c表示重用C的提交信息
git tag newbase
git rebase –onto newbase E^ master
git tag -d newbase//清理该tag
方案三:交互式变基
git rebase -i C^
将第二行的pick更改为squash,二者将合并(?还是没明白意思)


另外其他 git merge request,git cherrypick不做整理,今天只讲git rebase。

猜你喜欢

转载自blog.csdn.net/TTKatrina/article/details/79288238
今日推荐