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

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.kler.cn/a/315480.html

相关文章:

  • 【AI换装整合包及教程】CatVTON与其他虚拟试衣技术的详细对比
  • Vue常用加密方式
  • java操作ES(一)RestHighLevelClient(2)集成与demo
  • 洞察鸿蒙生态,把握开发新机遇
  • STM32学习笔记------GPIO介绍
  • XML Schema 字符串数据类型
  • Spring解决循环依赖的原理
  • RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案
  • Spring 源码分析
  • C++独立开发开源大数计算库 CBigNum
  • MySQL之内置函数
  • 【笔记】第三节 组织与性能
  • 搜维尔科技:Unity中的A.R.T.测量工具
  • 金仓数据库 KingbaseES参考手册 (8. 函数(九))
  • C++标准库容器类——string类
  • KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用
  • 机器翻译之Bahdanau注意力机制在Seq2Seq中的应用
  • 【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构
  • 对时间序列SOTA模型Patch TST核心代码逻辑的解读
  • 基于区块链的相亲交易系统源码解析
  • vue3 本地windows下的字体的引用
  • 分布式锁优化之 使用lua脚本改造分布式锁保证判断和删除的原子性(优化之LUA脚本保证删除的原子性)
  • FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
  • Java 入门指南:JVM(Java虚拟机)——类的生命周期与加载过程
  • web基础—dvwa靶场(八)SQL Injection(Blind)
  • 众数信科AI智能体政务服务解决方案——寻知智能笔录系统