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 //查看远程分支