git pull和git pull -- rebase

来源:互联网 发布:如何找天使投 知乎 编辑:程序博客网 时间:2024/06/05 22:54

在开始对比这两条命令之前,请大家思考三个问题:

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

原创粉丝点击