本文根据我的经验与网上资料,尝试解答以下2个问题:1.为什么每次push前都要pull一下; 2.git pull与git pull --​​rebase​​的区别。

【为什么每次push前都要pull一下】
虽然本地分支和远端分支是对应的关系,但其实它们两相当于是两个分支。
我们每次git add是把改动都加到stage暂存区,git ​​​commit​​​则是把这些变动提交到本地仓库,git push则是通过对比本地和远程的commit 记录把变动推送上去。
而我们在push前养好习惯去pull一下是为了应对多人一起开发的情况即通过在本地提前解决可能出现的冲突,从而可以减少远端接收push时出现冲突的概率。
比如说,我这次提交的改动是修改了文件A的某几行;但提交前在远端别人已经修改了文件A同样几行,这样就会产生冲突;我们在push前先行pull下来,在本地对冲突先行解决(保留哪些,删除哪些);然后再add, commit --amend, push提交修改。
这是个好习惯,同时如果有冲突,push操作也过不去,会强制我们进行pull操作先行在本地修改。

【git pull与git pull --rebase的区别】
​​​$git pull​​​指令其实执行了两个步骤git fetch和gitfetch和git merge;fetch做的事是从远端获取最新版本到本地(并不会合并分支),merge则是让两个分支的每一次提交都按照提交时间排序并且将远端分支(master/develop)和当前分支的最新一次commit点合并在一起形成一个新的commit,最终得到的分支树呈现非线性直线的形式。
如下图所示:

【git系列】add commit pull(rebase) push四步曲_git

​$git pull --rebase​​​指令其实执行了两个步骤​​$git fetch​​​和​​$git rebase​​​;fetch做的事是从远端获取最新版本到本地(并不会合并分支),rebase则是把当前分支的所有commit取消,保存成一个个的临时patch(保存在.git/rebase文件夹里),然后把当前分支更新到远端分支(master/develop),然后把这些临时patch文件应用到当前分支上并且把这些patch文件一个个重新生成对应的commit而非新的commit,从而保证了整个分支树的线性。(操作指令:​​$git pull --rebase​​​;若有冲突文件,去修改冲突,$git add, $git rebase --continue 来合并冲突,线性地连接本地分支与远程分支)
如下图所示:

【git系列】add commit pull(rebase) push四步曲_分支合并_02

综上所述,
​​​$git pull​​​适合于我们把当前分支合并到团队分支(master/develop)的时候,因为它保留了commit的时间记录利于团队管理;
​​​$git pull --rebase​​适合于把当前分支合并到个人分支的时候,因为个人分支需要定期和团队分支保持一致,执行–rebase操作之后别人的新的commit就可以显示在我们的commit之前了。

【资料来源】

  1. ​git pull与git fetch及git merge与git rebase的区别_Relian哈哈的博客-CSDN博客_git pull 和rebase区别​
  2. ​https://git-scm.com/docs/git-pull​

 转载自华为云社区,文章作者 gentle_zhou