在开始对比这两条命令之前,请大家思考三个问题:
1 工作区不干净(没有git add .)可以git pull或者git pull - -rebase代码吗?
结果是不可以,如果你没有将修改提交到暂存区,那么无论是pull还是pull –rebase都是不可以拉下来代码的
接下来我们再多思考下:
2 如果工作区修改提交到暂存区但是没有commit可以调用git pull和git pull - -rebase命令吗?
综上所述我们的结论是:
工作区不commit是无法pull代码的
接下来看push命令:
3 如果工作区修改没有add可以调用git push命令吗?
4 如果工作区修改没有commit可以调用git push命令吗?
综上所述我们的结论是:
工作区不commit是无法push代码的
根据上面的结论我们知道必须commit才可以push和pull代码(也就是说必须有结点才可以pull/push代码)看图我们来分析git pull和git pull - -rebase的区别:
1 远程分支为dev分支,本地分支叫work,当我们从dev分支1拉取到本地的时候,两个分支的起始状态都是1
2 这个时候我们本地分支修改了3,而dev分支其他人推送了2,这个时候就出现了一个问题,我们该如何拉取代码呢?
思路:
1 假如dev分支没有更改,本地分支上一个结点就是dev分支最新结点
那么pull下来的代码最新的结点还是2结点,所以push上去的时候dev最新的结点是2结点
2 假如dev分支有了更改,本地分支上一个结点不再是dev分支最新结点
那么本地分支会新产生一个结点(内部新commit了一个结点,就是我们经常看到的Merge branch**,这个时候本地分支的结点就是1-3-4,push上去的时候dev分支就是1-2-4),这个结点是2和3 merge之后的结果
rebase=re+base,我把他翻译成“重新定义基点,简称重定基”,本地分支最新的结点本来是3,但是我使用git pull –rebase的时候把3修改先隐藏,让本地分支的最新结点变成远端的2结点,再在2结点的基础上增加3结点,这样push的时候dev分支就是3结点而不是merge结点了,这样就可以让我们的所有提交保持成一条线而不是很多merge
confilct处理:
无论是pull还是rebase,当同一个文件被其他人改动之后就会出现冲突,rebase只能做到不出现merge结点但是和pull一样遇到冲突需要自行解决
git pull遇到冲突
这个时候遇到的冲突比较常见,我们一般是手动修改冲突之后再add,commit,push没有什么好讲的了
git pull –rebase遇到冲突
先进入冲突的文件,解决之后使用 add 或者 rm<文件>,之后直接 git rebase –continue即可(注意不用commit,使用add <文件名>而不是add .)
最后如何把让我们使用git pull做git pull –rebase的操作呢?
配置
如果想要把 rebase 当做 git pull 的默认值,可以在 .git/config 加上
[branch “master”]
remote = origin
merge = refs/heads/master
rebase = true
也可以直接加到 ~/.gitconfig 让所有的 tracked branches 都自动套用这个设定:
[branch]
autosetuprebase = always