git merge命令和git rebase应用场景很类似,在这一节当中我们先使用git merge进行合并操作一次,然后大家注意观察版本记录列表中的版本记录顺序。
现在首先我切换到test分支中,执行命令如下所示:
git checkout test命令执行完毕之后,Git 返回信息如下图所示: 在上图中,可以看到已经切换到test分支当中,现在我随意在test分支当中修改代码,然后提交一个版本,执行命令如下所示:
echo '44444444' >> aa.txt && git commit . -m 'rebase测试'命令执行完毕之后,会修改aa.txt文件的代码,并执行了git commit提交工作区的修改到新版本中,返回信息如下所示: 在上图中可以看到提交新版本成功。
一会使用git rebase命令演示时候还需要当前的场景,这里我将刚才提交的版本推送到远程去,这样需要恢复当前版本的时候就可以用远程覆盖本地版本,免得重复构建实验环境。
执行推送到远程仓库的命令如下所示:
git push --set-upstream origin test命令执行完毕之后,远程仓库返回的信息如下图所示: 在上图中可以看到推送到远程仓库已经成功,接下来在develop也进行一些改动。
首先切换到develop分支中去,执行命令如下所示:
git checkout develop命令执行完毕之后,Git 返回信息如下图所示: 在上图中可以看到已经切换到develop分支,接着我随意的修改代码提交几个版本,执行命令如下所示: develop仓库提交代码多次代码。
echo '1111111111' >> aa.txt && git commit . -m 'rebase测试' echo '2222222222' >> aa.txt && git commit . -m 'rebase测试2' echo '3333333333' >> aa.txt && git commit . -m 'rebase测试3'命令执行完毕之后,Git 返回的信息如下图所示: 在上图中可以看到提交了三个版本,
接着我们回到test分支中,并使用git merge命令将develop分支的代码合并过来,回到test分支的命令如下所示:
git checkout test命令执行完毕之后,Git 返回的信息如下图所示: 在上图中可以看到已经切换回 test 分支当中,接着使用git merge命令合并代码,执行命令如下所示:
git merge develop命令执行完毕之后,Git 返回的信息如下图所示: 在上图中可以看到合并代码成功,显示了一行代码变更,我们现在就可以使用git log命令查看版本日志列表的效果了,执行命令如下所示:
git log命令执行完毕之后,Git 返回的版本列表信息如下图所示: 在上图中可以看到刚才分别在两个分支下提交的四个版本,在版本列表中顺序是时间的先后顺序,最开始在test分支提交的版本在最下方,后来切换到develop分支提交的三个版本在上方,最上方的版本为merge branch的版本记录,先记住这是git merge命令合并代码效果。
接下来我们来试试git rebase命令的效果,通过版本记录列表对比两者有什么区别,我们现在依然在test分支下。
使用git reset命令将版本撤销到git merge前的状态,直接以远端为准即可,执行命令如下:
git reset origin/test --hard命令执行完毕之后,Git返回的信息如下图所示: 在上图中可以看到分支的版本已经回滚成功,我们可以使用git log命令来查看版本列表进行确认,执行的命令如下所示:
git log命令执行完毕之后,Git 返回的版本列表如下图所示: 在上图中可以看到当前只有rebase测试这个版本了,其他几个版本已经被撤销。
接着我们使用git rebase命令将develop分支的代码复制过来,执行的命令如下所示:
git rebase develop命令执行完毕之后,Git 返回的信息如下图所示: 在上图中可以看到git rebase已经成功执行,接着我们使用 git log 查看提交日志,执行命令如下所示:
git log命令执行完毕之后,Git 的版本列表如下图所示: 在上图中可以看到四个版本顺序与之前git merge版本记录是不一样的,git rebase命令后版本顺序不是按照时间,而是将develop分支的版本记录放在下方,在当前分支提交的同时也没版本放在最上方,有产生一个Merge branch的版本记录。
在这节中我们学习了一个git rebase命令,这个命令如果仅仅从代码层面比较,基本是没有区别的,主要的区别在于版本记录的变化,比如说,因为一些情况我需要在test分支修改一些代码,如果我使用了 merge 命令将 develop 的版本合并了进来,后续我想去撤销这次修改的代码,就比较麻烦。
因为git merge合并后的版本记录的顺序是按照时间顺序来的,这样在test分支提交的版本就可能离当前工作区非常远,这样要撤销起来会影响太多版本记录,而如果是git rebas命令进行的代码合并,它并不是按照时间来排序的,而是一定把 test分支的提交放在离工作区最近, 这样当需要撤销的时候影响面就很小,我们主要记录两个区别:
git merge命令合并代码之后,版本记录会按照时间顺序排序,并自动产生一个Merge branch的版本;git rebase命令合并代码之后,版本记录会将目标分支的版本放在后面,然后再将当前分支的版本记录放在前边。