Git 中 pull 操作和 rebase 操作的不同

由于在开发过程中,pull 操作和 rebase 操作都是用来合并分支的,所以我就常常分不清这两个操作具体有什么区别,所以才有了这篇博客来做个简单区分,具体细致差别还请移步到官方文档:Git - Reference (git-scm.com)

1)pull 操作明确来说,实际是分为了两步操作:fetch + merge

fetch:进行 pull 操作的时候,git 首先会将远程仓库中的所有远程分支的最新一次提交内容拉取到本地仓库中对于远程仓库的跟踪分支中,相当于进行一次更新。但是这次更新并不会进行远程分支和本地分支的合并。

本地仓库中对于远程仓库的跟踪分支,简称为远程跟踪分支。远程跟踪分支是远程分支的本地副本,它们以 远程仓库(一般都为 origin ) / 远程分支名 的形式存在。fetch 会更新这些远程跟踪分支,使其与远程仓库中的分支同步。

merge:紧接着,会将当前的工作分支和已经建立了联系的对应的远程分支进行一次合并。又或者在 pull 操作的后续选项中指定了分支名,也会将指定的远程分支和当前本地的工作分支进行合并。

根据官方文档给出的示例,我们就能看出 pull 操作在 git 历史提交记录长什么样:

假设第二行中的 master 分支是我们当前本地的 master,提交历史为:D-E-F-G 。且本地的 master 分支最新一次与远程分支进行同步的节点为 E 。

第一行为远程仓库中的远程 master 分支,提交历史为:A-B-C

此时我们进行 pull 操作,就相当于将远程分支中的最新一次提交 C 同步到本地分支:

H 节点就为 pull 操作的第二步 merge 操作所产生的一次提交。可以看到,进行 pull 操作,由于默认第二步操作是使用了 merge 操作,因此会保留完整的提交记录。

2)rebase 操作称为变基操作,之所以叫做变基,是因为该操作改变了" 基础 ",实际作用就是改变提交的原本(" 基 ")位置。

还是借助官方文档给出的例子来进行解释:

假设新增本地有两个分支,master 和 topic ,现在在 topic 分支上进行 rebase master 的操作

此时 git 相当于会将 topic 分支的所有提交记录进行摘除,然后安接到 master 分支的最新一次分支,就相当于原本是基于 master 分支 E 节点所进行修改的 topic 上的所有记录,现在变成了基于 master 分支上的最新一次提交进行的修改似的:

可以看到,rebase 操作会将提交历史变得更加简洁整齐,呈线性的提交记录,不会出现明显的合并痕迹。

因此,其实 pull 操作和 rebase 之间并没有直接关联,真正关联的是 merge 操作和 rebase 操作。

二者所呈现的提交历史是不同的,具体需要哪个操作就需要看实际场景:

如果需要保持整齐的提交历史,那么就选择 rebase 操作;

如果想要保留完整的提交历史,那么就选择 merge 操作。

在 pull 操作中,默认第二步是使用 merge 操作,但是我们也可以指定使用 rebase 操作来合并分支,通过设置 git config --global pull.rebase true 来配置 rebase 选项来实现。

相关推荐
工藤孤独1 天前
Git Worktree 从零到多智能体实战
git
微尘寒风1 天前
【Git】的安装和使用
java·git
胖大和尚2 天前
Git初始化本地文件夹,并推送到远端
git
啵啵啵12342 天前
Git 底层原理:分支为什么只是一个 41 字节的文件
git
demon75520032 天前
Git Worktree详解介绍
git·worktree
胖大和尚2 天前
当前仓库推送到同一台机器上的另一个文件夹
git
轮到我狗叫了3 天前
git - 版本控制工具 - 对应的常见命令 - 以及无需后续每次手动source conda
git
changxiang3 天前
GIT 备忘
git
DogDaoDao3 天前
Windows 开发提效工具全景指南:60+ 工具的工程化分层配置
windows·git·程序员·开发工具·powershell·everything·msys2
wdfk_prog4 天前
GitHub push 失败:如何扫描并清理 Git 历史中的大文件
git·elasticsearch·github