对比git pull和git pull --rebase

1、使用下面的关系区别这两个操作:
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase

2

一、基本

git rebase用于把一个分支的修改合并到当前分支。

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

$ git checkout -b mywork origin

假设远程分支"origin"已经有了2个提交,如图

现在我们在这个分支做一些修改,然后生成两个提交(commit).

$ vi file.txt

$ git commit

$ vi otherfile.txt

$ git commit

...

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。

在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

$ git checkout mywork

$ git rebase origin

这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

当‘mywork‘分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

二、解决冲突

在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

$ git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

$ git rebase --abort

三、git rebase和git merge的区别

现在我们可以看一下用合并(merge)和用rebase所产生的历史的区别:

当我们使用Git log来参看commit时,其commit的顺序也有所不同。

假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,

对于使用git merge来合并所看到的commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1

对于使用git rebase来合并所看到的commit的顺序(从新到旧)是:C7 ,C6‘,C5‘,C4,C3,C2,C1

因为C6‘提交只是C6提交的克隆,C5‘提交只是C5提交的克隆,

从用户的角度看使用git rebase来合并后所看到的commit的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1

另外,我们在使用git pull命令的时候,可以使用--rebase参数,即git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。关于git pull的更多内容请参考《git pull简介

时间: 2024-08-04 21:37:07

对比git pull和git pull --rebase的相关文章

git fetch 、git pull 与 git pull --rebase

1. git fetch 与 git pull 都是从远程拉取代码到本地,git fetch只是拉取到本地,git pull不仅拉取到本地还merge到本地分支中.所以git pull是git fetch与git merge的集合体.  2. git pull 与 git pull --rebase git pull的默认行为是git fetch + git merge,  git pull --rebase则是git fetch + git rebase. 从目的来说,两者没差别,运行之后,

Git 协作:Fetch Pull Push Branch Remote相关

前言 学习git的时候,我们首先学习的是最常用的,自己独立开发Software时用的命令: git init #初始化git仓库 git add <file_name> #将文件添加到暂存区 git rm <file_name> #将暂存区的该文件删除 git commit -m "<commit info>" #将暂存区的修改提交到当前分支 git status #查看当前状态 git reset --hard <commit_id>

git pull 与git fetch的区别

从百度上看到很多关于git fetch 和 git  pull 的不同 实践一下: 从github上新建一个项目try,copy到本地. 在github网站里修改readme.txt文件,新增加一句[alter readme] 在本地仓库的readme.txt也新增加一句,[add some thing] 现在想把本地代码提交到github上,是不能提交的.会出现错误提示!!! 应该先从远程仓库中把代码下载下来 (1)用git pull会怎么样呢? git pull origin master

Git fetch和git pull的区别

2013-03-04 10:58 65080人阅读 评论(4) 收藏 举报 Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin mastergit log -p master..origin/mastergit merge origin/master 以上命令的含义: 首先从远程的origin的master主分支下载最新的版本到origin/master分支上 然后比较本地的m

git fetch 和 git pull 的区别

Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge git fetch origin master git log -p master..origin/master git merge origin/master 以上命令的含义: 首先从远程的origin的master主分支下载最新的版本到origin/master分支上 然后比较本地的master分支和origin/master分支的差别 最后进行合并 上述

git fetch 和 git pull 的差别

Git中从远程的分支获取最新的版本号到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本号到本地,不会自己主动merge git fetch origin master git log -p master..origin/master git merge origin master 以上命令的含义: 首先从远程的origin的master主分支下载最新的版本号到origin/master分支上 然后比較本地的master分支和origin/master分支的区别 最后进行

Git 代码更新:git fetch 和 git pull 的区别

Git 从远程的分支获取最新的版本到本地有这样 2 个命令: 1. git fetch:相当于是从远程获取最新版本到本地,但不会自动 merge git fetch origin master git log -p master origin/master git merge origin/master 以上命令的含义: 首先从远程的 origin 的 master 主分支下载最新的版本到 origin/master 分支上 然后比较本地的 master 分支和 origin/master 分支

git 远程操作 git pull git push

git pull 用法: git pull <远程主机名> <远程分支名>:<本地分支名> 常用写法: 1. 全路径 git pull origin master:master 取回远程主机的master分支 与本地的master分支合并 2.省略本地分支 git pull origin master 取回远程主机名origin的master分支, 并与本地的当前分支合并 实质上,这等同于先做git fetch,再做git merge git fetch origin

git pull 与 git fetch的区别

以前在项目组用git做版本控制是一直没搞明白git pull与git fetch的区别,昨天在网上查了以后大致知道了怎么回事: 用 git fetch 更新项目的的方法如下 git fetch origin  master:tmp //从远程版本库里拉取最新的matsr分支 git diff tmp //查看最新的主分支的与本地分支的区别 git merge//合并最新的远程主分支与本地分支 git pull的话是一种更简单的方式,git pull 是git fetch+ git merge的整