当前位置:   article > 正文

git pull 与 git pull --rebase_git pull rebase

git pull rebase


git pullgit pull --rebase 命令都是从远端拉取代码,更新我们的仓库。

前提知识

四个区:

  • 工作区 :代码在本地存储的目录位置
  • 暂存区 :git可以追踪的代码(工作区可以将代码添加到暂存区(add))——临时存储
  • 本地库 :暂存区的代码可以提交到本地库(commit),并生成对应的版本 ——生成历史版本
  • 远程库:(远程库:如github)本地区的代码可以提交到远程库(push),并生成对应的版本 ——存储在远端

区别git pull 与 git pull --rebase

简单理解

git pullgit pull --merge的简写。
git pullgit pull --rebase 的关系如下:

git pull = git fetch + git merge
git pull --rebase =  git fetch + git rebase
  • 1
  • 2
  • git fetch是将远程库的最新内容拉到本地库,用户在检查了以后决定是否合并到工作区中。
  • git merge是将本地的两个分支合并,如果在分支A中执行git merge B,那就是将分支B中的代码合并到分支A中。
  • git pull 则是将远程主机的最新内容拉去到本地库后直接合并到工作区中,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
    图示表示:
    在这里插入图片描述
  • git rebase是将提交到某一分支上的所有修改都移至另一分支上。即如果在B分支上使用git rebase A就是将B分支上的修改都变基(移到)A分支上
    详见:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
  • git pull --rebase则是将远程主机的最新内容拉去到本地库后直接变基到工作区中,即:git pull --rebase = git fetch + git rebase,可能会产生冲突手动解决。
    图示表示:
    在这里插入图片描述

git merge与git rebase

通过上面的比较,git pull 与 git pull --rebase的区分实际上就是git merge与git rebase的区分。为了方便区分我们使用两个不同名分支进行讲解。

  • git merge是合并分支。是将yang分支合并到master分支之后,master分支的代码有所改动,会自动commit,生成一个新的结点,并且不会影响之前两分支的提交节点。
    合并前:
    在这里插入图片描述

合并后:
在这里插入图片描述
执行的合并命令:

$ git checkout master
$ git merge yang
  • 1
  • 2
  • git rebase是变基。是将yang分支变基到master分支,就是将yang分支的代码改动完全合并到master分支,不会生成新的结点。
    变基前:
    在这里插入图片描述
    变基后:

在这里插入图片描述
执行的变基命令是:

$ git checkout yang
$ git rebase master
  • 1
  • 2

然后需要再执行如下命令,是master分支指向最新节点

$ git checkout master
$ git merge yang
  • 1
  • 2

在这里插入图片描述
由此可以看出merge和rebase的区别:

  • merge 会多出一次 commit生成一个新节点,rebase不会生成新结点。
  • merge 的提交树是非线性的,rebase 的提交树是线性的(通过重写提交历史)。

git merge与git rebase实际操作

有一个yangMerge分支,有如下提交记录:

commit ... (HEAD -> yangMerge)
Author: ...
Date:   Mon Jan 22 16:36:06 2024 +0800

    fix:merge2

commit ...
Author: ...
Date:   Mon Jan 22 16:34:40 2024 +0800

    fix:merge1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

有一个yangRebase分支,有如下提交记录:

commit ... (HEAD -> yangRebase)
Author: ...
Date:   Mon Jan 22 16:36:29 2024 +0800

    fix:rebase2

commit ...
Author: ...
Date:   Mon Jan 22 16:35:03 2024 +0800

    fix:rebase1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 如果执行rebase命令:
    在yangRebase分支执行git rebase yangMaster的命令,再查看分支,显示如下内容:
commit ...  (HEAD -> yangRebase,yangMerge)
Author: ...
Date:   Mon Jan 22 16:36:29 2024 +0800

    fix:rebase2

commit ...
Author:...
Date:   Mon Jan 22 16:35:03 2024 +0800

    fix:rebase1

commit ...
Author:...
Date:   Mon Jan 22 16:36:06 2024 +0800

    fix:merge2

commit ...
Author: ...
Date:   Mon Jan 22 16:34:40 2024 +0800

    fix:merge1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

之后同步head分支:
在yangRebase分支执行git merge yangMaster的命令

commit ... (HEAD -> yangRebase)
Author: ...
Date:   Mon Jan 22 16:36:29 2024 +0800

    fix:rebase2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 如果执行merge命令:
    在yangMerge分支执行git merge yangRebase的命令,再查看分支,显示如下内容:
commit ... (HEAD -> liyangDevMerge)
Merge: ...  // merge生成新结点记录
Author: ...
Date:   Mon Jan 22 16:59:19 2024 +0800

    Merge branch 'liyangDevRebase' into liyangDevMerge

commit ...
Author: ...
Date:   Mon Jan 22 16:59:03 2024 +0800

    fix:rebase2

commit ...
Author: ...
Date:   Mon Jan 22 16:58:42 2024 +0800

    fix:rebase1

commit ...
Author: ...
Date:   Mon Jan 22 16:36:06 2024 +0800

    fix:merge2

commit ...
Author: ...
Date:   Mon Jan 22 16:34:40 2024 +0800

    fix:merge1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

可以发现merge命令会生成一个新的合并节点,并且head指针直接定位到当前分支最新提交的merge节点上。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/496324
推荐阅读
相关标签
  

闽ICP备14008679号