Git 学习笔记 - 17 - Rebase
注:本文参照的是廖雪峰老师的Git教程
概述:
之前有用到 git log --graph --pretty=oneline --abbrev-commit
命令去查看分支变化的轨迹,我们可以看到整个轨迹是弯弯曲曲的,特别是经历了多人协作后,遇到冲突问题,先pull下来,然后push上去,会变得更加难看,要想强迫这个轨迹变得整洁一点,可以使用 rebase 命令。
我这边在dev上新建了一个分支testhello,然后在这个testhello分支上修改hello.py文件,然后合并到dev分支上去,然后又合并到master分支上,加上之前的操作,看起来就有点弯弯曲曲了。
ps:其中在合并到master分支上时,进入了一个我没怎么注意的界面,没看懂,然后我就直接输入 :Q!
就退出了,不过没影响合并。
ps:我擦,我没使用 --no-ff 的,直接把dev给合并上去了…
操作:
教程上说的是多人协作引起的轨迹不好看:
在和远程分支同步后,我们对hello.py
这个文件做了两次提交。用git log
命令看看:(还是之前的带参数的老命令)
* 582d922 (HEAD -> master) add author
* 8875536 add comment
* d1be385 (origin/master) init hello
* e5e69f1 Merge branch 'dev'
|\
| * 57c53ab (origin/dev, dev) fix env conflict
| |\
| | * 7a5e5dd add env
| * | 7bd91f1 add new env
...
注意到Git用(HEAD -> master)
和(origin/master)
标识出当前分支的HEAD和远程origin的位置分别是582d922 add author
和d1be385 init hello
,本地分支比远程分支快两个提交。
现在我们尝试推送本地分支:git push origin master
To github.com:michaelliao/learngit.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
很不幸,失败了,这说明有人先于我们推送了远程分支。按照经验,搞定它,这时加上刚才合并的提交,现在我们本地分支比远程分支超前3个提交。
用git log --graph --pretty=oneline --abbrev-commit
看看:
* e0ea545 (HEAD -> master) Merge branch 'master' of github.com:michaelliao/learngit
|\
| * f005ed4 (origin/master) set exit=1
* | 582d922 add author
* | 8875536 add comment
|/
* d1be385 init hello
...
对强迫症童鞋来说,现在事情有点不对头,提交历史分叉了。如果现在把本地分支push到远程,有没有问题?
有!
什么问题?
不好看!
有没有解决方法?
有!
这个时候,rebase就派上了用场。我们输入命令git rebase
可以整理。
ps:测试失败,后续想了想或许我应该在master上造一个冲突,这样的话或许会看到结果。
总结:
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。