git fetch 与 git pull 和 git pull --rebase之间的区别

the diffrence between git fetch and git pull and git pull--rebase

Posted by alovn on October 30, 2020

git pull 和 git fetch 的区别

Git 从远程分支获取最新代码版本到本地,有两个命令:git pull 和 git fetch, 那么它们的区别在哪里呢?

git fetch

git fetch 是从远程获取最新版本代码到本地,不会自动merge,你必须手动合并。 使用 git fetch 更新代码后,这时候相当于本地存储了两个代码的版本号,可以看下:

1
cat .git/FETCH_HEAD

.git/FETCH_HEAD 已经是最新的commit id, 但是本地分支中的代码还未更新, 我们还要通过merge去从本地远程分支(origin/xxx)合并到本地分支,如果这两个版本的代码都修改了同一处的代码,这时merge会出现冲突,我们解决冲突后就生成一个新的代码版本,即一个新的commit id。

1
git merge origin/main

执行merge前,本地代码要先commit。 PS: 目前我在github新建demo项目测试的时候,默认分支名称已经从之前的master修改为main (自2020年10月1日开始)。

git pull

git pull 更新代码就比较简单暴力了, 它会从远程获取最新版本代码并merge到本地。 git pull看起来像是:

1
git pull == git fetch + git merge

但是根据commit id来看,它们的实现是不一样的。

git pull 与 git pull –rebase 的区别

1
git pull --rebase == git fetch + git rebase FETCH_HEAD

merge 和 rebase

现在我们有两个这样的分支, dev 和 main, 提交如下:

1
2
3
       D---E dev
      /
 A---B---C---F--- main

在 main 分支执行 git merge dev ,会得到如下的结果:

1
2
3
       D--------E
      /          \
 A---B---C---F----G---   dev, main

在 main 分支执行 git rebase dev, 会得到如下的结果:

1
A---B---D---E---C‘---F‘---   dev, main

merge 操作会生成一个新的节点,之前的提交分开显示。 而 rebase 操作不会生成新的节点,是将两个分支融合成一个线性的提交。 如果 rebase 过程中有代码冲突,需要解决冲突后执行 git rebase –continue 继续 rebase。

注意: 尽量不要在master或main分支上 rebase,尽量是在自己使用的分支上使用rebase操作。

git 查看分支

1
2
3
git branch //查看本地分支
git branch -a //查看所有分支
git branch -r //查看远程分支