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.mzph.cn/diannao/54254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 获取 ApplicationContext

1. 概念 ApplicationContext是什么&#xff1f; 简单来说就是Spring中的容器&#xff0c;可以用来获取容器中的各种bean组件&#xff0c;注册监听事件&#xff0c;加载资源文件等功能 2. 获取ApplicationContext的方式 2.1. 创建工具类 通过此工具类&#xff0c;可以方便的…

JDBC 编程

目录 JDBC 是什么 JDBC 的工作原理 JDBC 的使用 引入驱动 使用 常用接口和类 Connection Statement ResultSet 使用总结 JDBC 是什么 JDBC&#xff08;Java Database Connectivity&#xff09;&#xff1a;Java数据库连接&#xff0c;是一种用于执行 SQL 语句的Java…

git学习【持续更新中。。。】

git学习【持续更新中。。。】 文章目录 git学习【持续更新中。。。】一、Git基本操作1.创建本地仓库2.配置本地仓库1.局部配置2.全局配置 3.认识工作区、暂存区、版本库4.添加文件5.修改文件6.版本回退7.撤销修改8.删除文件 二、Git分支管理1.理解分支2.创建、切换、合并分支3.…

AI 时代,大模型产业落地的八大思考

引言 在人工智能领域&#xff0c;大模型技术正逐渐成为推动行业进步的关键力量。随着技术的发展&#xff0c;大模型不仅在学术界引起了广泛的关注&#xff0c;也在产业界展现出巨大的应用潜力。然而&#xff0c;如何将这些强大的模型有效地应用到实际产业中&#xff0c;仍然是…

vue3中标签的 ref 属性

在 Vue 3 中&#xff0c;ref 是一个强大的特性&#xff0c;用于处理组件和 DOM 元素的引用。它有两个主要的应用场景&#xff1a;一是在模板中引用 DOM 元素&#xff0c;二是在 Vue 组件中引用子组件实例。 1. 在模板中使用 ref 引用 DOM 元素 目的&#xff1a;直接访问和操作…

解决:Vue 中 debugger 不生效

目录 1&#xff0c;问题2&#xff0c;解决2.1&#xff0c;修改 webpack 配置2.2&#xff0c;修改浏览器设置 1&#xff0c;问题 在 Vue 项目中&#xff0c;可以使用 debugger 在浏览器中开启调试。但有时却不生效。 2&#xff0c;解决 2.1&#xff0c;修改 webpack 配置 通…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

【linux】 date命令

date 命令在 Linux 和类 Unix 系统中用于显示和设置系统的日期和时间。这个命令非常灵活&#xff0c;允许用户以不同的格式查看日期和时间&#xff0c;也可以用来设置新的日期和时间&#xff08;虽然这需要管理员权限&#xff0c;通常是通过 sudo 或以 root 用户身份执行&#…

Android Studio Menu制作

文章目录 一、创建菜单在Activity上新建onCreateOptionsMenu新建menu目录及资源文件新建Menu一级菜单在Activity上加载Menu测试效果 二、菜单点击事件 一、创建菜单 在Activity上新建onCreateOptionsMenu Overridepublic boolean onCreateOptionsMenu(Menu menu) {return supe…

Rust:Result 和 Error

在 Rust 编程语言中&#xff0c;错误处理是一个核心部分&#xff0c;用于确保程序的健売性和可靠性。Rust 通过 Result 枚举和 Error 特质&#xff08;trait&#xff09;来处理错误。 Result 枚举 Result 是一个泛型枚举&#xff0c;用于表示一个操作可能成功或失败。它有两个…

NEXT.js 创建postgres数据库-关联github项目-连接数据库-在项目初始化数据库的数据

github创建项目仓库创建Vercel账号选择hobby连接github仓库install - deploy创建postgres数据库&#xff08;等待deploy完成&#xff09; Continue to DashboardStorage&#xff08;头部nav哪里&#xff09;create Postgresconnect连接完后&#xff0c;切换到.env.local&#x…

Pytest配置文件pytest.ini如何编写生成日志文件?

1、新建pytest.ini文件 [pytest] log_clitrue log_leveLNOTSET log_format %(asctime)s %(levelname)s %(message)s %(filename)s %(funcName)s %(lineno)d log_date_format %Y-%m-%d %H:%M:%Slog_file ./logdata/log.log log_file_level info log_file_format %(asctime…

深入探究HTTP网络协议栈:互联网通信的基石

在我们日常使用互联网的过程中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;扮演着至关重要的角色。无论是浏览网页、下载文件&#xff0c;还是进行在线购物&#xff0c;HTTP协议都在背后默默地支持着这些操作。今天&#x…

杂牌鼠标侧键设置

X-Mouse Button Control修改侧键基本功能介绍-CSDN博客 下载链接 【X-Mouse汉化版】X-Mouse中文版 v2.19.2 绿色版&#xff08;支持Win10&#xff09;-开心电玩 (kxdw.com)

SQL:子查询

子查询是SQL中强大的功能之一&#xff0c;它允许在一个查询内部嵌套另一个查询&#xff0c;以便处理更复杂的逻辑或数据检索需求。子查询可以用在SELECT、FROM、WHERE、HAVING、IN、ANY、ALL等子句中&#xff0c;根据使用场景和目的的不同&#xff0c;子查询可以分为多种类型。…

Python 入门教程(3)基础知识 | 3.6、标准输入与输出

文章目录 一、标准输入与输出1、标准输入2、标准输出3、格式化输出3.1、使用%操作符的格式化3.2、使用str.format()方法3.3、使用f-strings&#xff08;格式化字符串字面量&#xff09; 前言&#xff1a; Python的标准输入与输出是编程中非常基础且重要的概念&#xff0c;它们允…

MATLAB图像处理

MATLAB图像处理 MATLAB&#xff0c;作为美国MathWorks公司出品的商业数学软件&#xff0c;以其强大的矩阵运算能力和丰富的函数库&#xff0c;在图像处理领域得到了广泛的应用。MATLAB不仅提供了基础的图像处理功能&#xff0c;还通过图像处理工具箱&#xff08;Image Process…

一个基于Java SSM框架(Spring、SpringMVC、MyBatis)的沙县小吃点餐系统

下面是一个基于Java SSM框架&#xff08;Spring、SpringMVC、MyBatis&#xff09;的沙县小吃点餐系统的简单代码案例。这个系统通常包含用户管理、菜单浏览、点餐、订单管理等功能。 1. 实体类&#xff08;POJO&#xff09; 首先&#xff0c;我们定义一个简单的Product实体类…

git分支合并时忽略指定文件

分支合并忽略特定文件步骤 1.在项目根目录下cmd窗口运行以下命令 git config merge.ours.driver true2.在项目根目录下新建文件.gitattributes然后文件中写入需要忽略的文件名 mergeours, 一个文件占一行 Dockerfile mergeours /nginx/default.conf mergeours

Linux中权限和指令

&#x1f4a5;1、Linux基本指令 1.1 mv 指令 mv指令是move的缩写&#xff0c;用来移动或重命名文件、目录&#xff0c;经常用来备份文件或目录。 mv old_name new_name&#xff1a; 重命名文件或目录mv file /path/to/directory&#xff1a; 移动文件到指定目录 roothcss-ecs…