当前位置: 首页 > news >正文

git pull的merge和rebase模式

git pull 命令用于将远程仓库的更改拉取到本地仓库,并合并到当前分支中。git pull 默认使用合并(merge)模式,但也可以选择使用变基(rebase)模式。

Merge 模式(默认模式)

git pull 默认会执行一次合并操作,它会将远程分支的更改合并到本地分支中。这种方式保留了本地提交的历史,同时在需要时生成一个合并提交(merge commit),用来标记两条历史的合并点。

git pull origin <branch>  # 默认 merge 模式

特点:

  • 保留历史:本地和远程的提交历史完整保留,包括所有的分支和合并信息。
  • 可能产生合并提交:如果本地有新的提交,并且远程分支也有更新,git pull 可能会生成一个新的合并提交(merge commit)。
  • 分支历史更复杂:随着时间推移,可能会导致分支历史变得复杂,含有很多合并提交。

适用场景:

  • 当我们想保留完整的历史记录,不介意合并提交的存在时,可以使用 merge 模式。

Rebase 模式

git pull --rebase 会将远程分支的更改“应用”在本地分支的基础上,重新排列本地分支上的提交。通过变基,所有的本地提交会“移动”到远程提交之后,历史看起来更线性、整洁。

git pull --rebase origin <branch>

特点:

  • 线性历史:本地提交会被“重新应用”在远程分支的更改之上,生成更线性的历史,避免了合并提交。
  • 历史修改:变基会改变本地提交的哈希,因此会重写提交历史,需要在多用户协作时谨慎使用。
  • 可能遇到冲突:在变基过程中,如果有冲突,必须手动解决冲突并继续变基。

适用场景:

  • 当我们希望保持一个干净、线性的历史,不希望产生合并提交时,可以使用 rebase 模式。
  • 适合个人或少量协作的开发流程,但在多人合作时需要特别小心,因为它会修改历史。

全局配置 git pull 使用变基模式

git config --global pull.rebase true

这条命令会将 git pull 的默认行为改为 变基。之后每次执行 git pull 时,都会自动进行变基操作,而不需要显式使用 --rebase 参数。 

全局配置 git pull 使用合并模式

git config --global pull.rebase false

如果你更习惯或者更喜欢合并(merge)的方式,可以通过这条命令将默认行为设置为合并。 

自动变基遇到的问题

自动变基在本地有更改时会遇到问题,因为 Git 要求变基时工作区必须是干净的。

常用的两种方法是:

  • 提交未完成的更改(通过 git commit 暂存代码)
  • 使用 git stash 暂存更改

方法 1:git commit

在我们准备进行 git pull 之前,可以通过 git commit 提交我们当前的更改。这是开发中最常见的操作,尤其适用于那些已经完成或者接近完成的改动。提交之后,Git 会允许我们进行变基操作。

git commit -m "WIP: save changes before pull"
git pull --rebase

提交的信息可以暂时使用类似 "WIP"(Work In Progress)这样的标记,待完成改动后可以再修改提交记录,或者按需进行后续开发。

方法 2:git stash

如果当前代码改动还没有准备好提交,而我们又需要先拉取远程更改,这时 git stash 就是一个非常方便的工具。它会将我们的更改保存到一个栈中,保持工作区干净以便进行拉取。

保存本地更改:

git stash

这会将我们的未提交改动保存起来,并让工作区回到清洁状态。

执行 git pull --rebase:

git pull --rebase

恢复之前的更改: 使用 git stash pop 从栈中取出保存的更改,并应用到当前工作区:

git stash pop

这一步会恢复我们之前保存的更改。如果变基和拉取成功,我们就可以继续在此基础上进行开发了。

冲突问题

当在使用 git pull --rebase 时遇到冲突,处理方法和普通的变基流程是相同的。Git 允许我们手动解决冲突,然后继续变基过程。

1、执行 git pull --rebase: 当我们拉取远程分支时,如果远程分支和本地分支存在冲突,Git 会暂停变基,并提示我们解决冲突。

git pull --rebase

2、解决冲突: Git 会标记出冲突的文件,并且我们可以看到冲突区域。在每个冲突文件中,Git 会插入冲突标记,类似于:

<<<<<<< HEAD
本地代码
=======
远程代码
>>>>>>> remote-branch

我们需要手动编辑这些文件,选择保留的代码,删除冲突标记,或者合并双方的更改。

3、标记冲突已解决: 冲突解决完毕后,需要通过 git add 命令将解决后的文件添加到暂存区:

git add <file1> <file2>  # 针对所有已解决的文件

4、继续变基: 当所有冲突都解决并暂存后,执行以下命令继续变基过程: 

git rebase --continue

放弃变基(可选): 如果在冲突处理过程中发现问题或者不想继续变基,可以通过以下命令放弃当前变基并恢复到变基前的状态:

git rebase --abort

总结:

  • 遇到冲突时,只需按照 Git 提示解决冲突后,执行 git rebase --continue 即可完成变基。
  • 如果不想继续变基,也可以通过 git rebase --abort 放弃变基,回到拉取前的状态。

如何选择

  • 如果我们想保持提交历史的完整性、包括合并提交,merge 是更合适的选择。
  • 如果我们更注重简洁的线性历史,并且可以处理潜在的冲突,rebase 是理想的选择。

http://www.mrgr.cn/news/29554.html

相关文章:

  • <el-popover>可以展示select change改变值的时候popover 框会自动隐藏
  • 【风力发电】基于虚拟惯性控制+一次调频+下垂控制的DFIG双馈风力发电机三机九节点仿真模型
  • QJson-趟过的各种坑(先坑后用法)
  • SpringBoot整合Freemarker(四)
  • Solon MVC 的 @Mapping 用法说明
  • Android CoordinatorLayout:打造高效交互界面的利器
  • 闲置物品交易系统小程序的设计
  • PWM控制技术(基本思想、逆变电路及其控制方法)
  • macOS平台TensorFlow环境安装
  • Day22笔记-多态函数重写运算符重载对象的内置内容
  • 低代码门户技术:构建高效应用的全新方式
  • 硬件基础知识
  • vue3+ant design vue 中弹窗自定义按钮设置及以冒号为基准布局
  • 不限学历!这个证书在上海太香了!利于积分、落户、抵扣个税...
  • webGL 综合教程100+【目录】
  • 堪比理科博士生的最强AI大模型:GPT-o1全面测评它来了
  • vector扩容
  • 超详细超实用!!!零基础java开发之云风笔记接口开发之删除笔记(十一)
  • Python精选200Tips:141-145
  • Mybatis+Druid+MybatisPlus多数据源配置
  • 高效音频格式转换实战:使用Python和FFmpeg处理MP3到WAV的转换20240918
  • 启程Pulsar:深入剖析高速启动引擎,揭秘消息中间件巨兽的诞生
  • Matlab 的.m 文件批量转成py文件
  • Vue|mixin混入
  • YOLOv8 OBB win10+ visual 2022移植部署
  • 如何使用宝塔面板安装中间件