这个 rebase 和前面学的东西关联性不大,是一个独立的概念。rebase 能够让我们的 git 提交记录变得非常简洁,看图:
rebase 的第一个场景
比如看下图,我重新创建了一个文件夹,里面创建了 4 个文件,每创建一个文件就提交一个版本,现在有下面 4 个版本了,但是 v2、v3 和 v4 版本只是一些没有太大改动的版本,你想把这些记录合并成为一个,就用到了我们的 rebase:
方式 1:
将指定版本号的版本一直到当前最新版本全部合并到一起
1 | git rebase -i 版本号 |
方式2:常用
以当前最新版本为基准,合并指定数目的版本
1 | git rebase -i HEAD~3 # 3表示合并3个版本,而HEAD~3的意思是以当前最新的版本开始,合并最近的三个版本,也就是v4、v3、v2将合并到一起 |
那我们执行一下 git rebase -i HEAD~3
这个指令看一下效果,执行完之后你会看到这样一个界面:
然后修改 :
然后你会看到下面的页面:
然后我们在描述信息的地方可以改一些描述信息,比如改成下面的样子:
这样我们的提交记录就更加简洁了,但是有个注意事项,**如果你合并版本之前,已经将v2版本push到远程了,这样你再合并v2版本的话,等你再push到远程会导致远程的版本变的很混乱,所以建议不要将已经push到远程的版本进行合并,我们最好只合并自己本地的,然后再push到远程。**
rebase 的第二个场景
看图:
操作流程:
创建 dev 分支和切换到 dev 分支上
1
2git branch dev
git checkout dev创建一个
dev.txt
文件提交版本
1
2git add .
git commit -m 'dev branch'切换到 master 分支上
1
git checkout master
创建一个
master.txt
文件在 master 分支上提交一下最新添加的 master.txt 文件也作为 master 分支上的一个版本
1
2git add .
git commit -m 'master branch'
在 dev 分支上执行一个 git log
查看一下 dev 分支提交的版本
在 master 分支上执行一个 git log
查看一下 master 分支提交的版本
1 | git log --graph # 图形化界面显示所有的提交记录 |
到目前为止,我们就做出了上面那个图的效果,在 dev 分支上有一个版本,在 master 分支上有其他的版本。
那么以后我们再开发的时候,可以通过 rebase 来让 dev 分支上的记录合并到 master 分支上。那么我们在 master 分支上再查看 git log --graph
的时候就只能看到一条线的记录了
现在我们通过 rebase 来合并一下 dev 分支上的版本,让git log显示的记录编程一条线
切换到 dev 分支
1
git checkout dev
注意,因为 dev 分支上的代码没有 master 分支上的全,所有先合并一下 master 分支,然后再进行后面的操作
1
git merge master
创建一个
dev1.txt
文件1
2git add .
git commit -m 'dev branch commit 1'切换到 master 分支
1 | git checkout master |
创建一个
master1.txt
文件1
2git add .
git commit -m 'master branch commit 1'这样的话我们在 dev 分支上有个版本,master 分支上又一个版本
再次切换到 dev 分支
1
git checkout dev
将 dev 分支上的这个新记录并到 master 分支的记录上
1
git rebase master
切换回 master 分支
1
git checkout master
合并分支
1 | git merge dev |
- 然后我们再执行日志查看命令,就看到了一条线,并且这条线上有dev分支开发的那个版本
1 | git log --graph |
rebase 的第三个场景
不做演示了,看看图吧:
其实第三个场景有点类似我们的第二个场景。不过是产生在当我们执行 pull 的时候,如果本地代码和远程的代码有冲突,会导致我们本地的分支进行 git log 日志的分叉。为了防止这种分叉,我们使用 fetch 和 rebase 两个指令来代替,rebase 也能够合并代码。(这个就作为了解吧)
注意:既然 rebase 操作其实也是合并代码的操作,那么我们如果在进行 rebase 指令的时候,代码有冲突怎么办?手动解决冲突,然后执行一下 git 提示的指令,比如git add等。然后执行一个 git rebase --continue
,来继续执行 rebase 指令就可以了。