当前位置: 首页 > 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 是理想的选择。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 孙怡带你深度学习(2)--PyTorch框架认识
  • LeetCode[中等] 74.搜索二维矩阵
  • Flask-Migrate的使用
  • 网络安全实训八(y0usef靶机渗透实例)
  • 9.17日常记录
  • JavaEE:网络编程(套接字)
  • [Meachines] [Medium] Bart Server Monitor+Internal Chat+UA投毒+Winlogon用户密码泄露权限提升
  • 线性代数书中求解线性方程组的三种方法的实例
  • TESSY创建以及设计一个测试用例
  • 英文ai写作怎么写?5个软件帮助你轻松进行ai写作
  • 9.18学习记录
  • C++:日期类的实现
  • 20240918 每日AI必读资讯
  • GEE教程:1950-2023年ECMWF数据中积雪的长时序统计分析
  • MySQL学习(视图总结)
  • [deviceone开发]-do_Webview的基本示例
  • “大数据应用场景”之隔壁老王(连载四)
  • 30秒的PHP代码片段(1)数组 - Array
  • CSS 三角实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • flutter的key在widget list的作用以及必要性
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • javascript从右向左截取指定位数字符的3种方法
  • Java读取Properties文件的六种方法
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • NSTimer学习笔记
  • Promise面试题,控制异步流程
  • 初识 beanstalkd
  • 分布式任务队列Celery
  • 机器学习 vs. 深度学习
  • 记一次用 NodeJs 实现模拟登录的思路
  • 前端性能优化--懒加载和预加载
  • 如何用vue打造一个移动端音乐播放器
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 用 Swift 编写面向协议的视图
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 第二十章:异步和文件I/O.(二十三)
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # Redis 入门到精通(一)数据类型(4)
  • #if 1...#endif
  • #传输# #传输数据判断#
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #数学建模# 线性规划问题的Matlab求解
  • (2)空速传感器
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (第30天)二叉树阶段总结
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包