git pull的merge和rebase模式

embedded/2024/9/25 20:29:20/

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.ppmy.cn/embedded/116813.html

相关文章

【论文阅读】视觉里程计攻击

Adversary is on the Road: Attacks on Visual SLAM using Unnoticeable Adversarial Patch 一、视觉SLAM的不安全因素 根据论文的分析&#xff0c;视觉SLAM由于完全依赖于特征&#xff0c;缺少验证机制导致算法不安全。前端在受到干扰的情况下&#xff0c;会导致误匹配增加&…

使用 MyBatis 进行批量更新

引言 在企业级应用中&#xff0c;批量操作数据库是非常常见的需求。MyBatis 是一个优秀的持久层框架&#xff0c;它提供了灵活的方式来执行批量更新操作。本文将详细介绍如何使用 MyBatis 的 XML 配置进行批量更新。 环境准备 1. 添加依赖 首先&#xff0c;在 pom.xml 文件…

前端-js例子:todolist

实现效果图&#xff1a; 实现步骤&#xff1a; 1.body部分 1.首先&#xff0c;设置输入数据的框和按钮进行操作 2.设置一个表格标签&#xff08;有边框&#xff09;&#xff0c;首先在表头放置两列&#xff08;“事项”‘’操作&#xff09; <body><div class"…

20240921在友善之臂的NanoPC-T6开发板上使用Rockchip原厂的Android12适配宸芯的数传模块CX6602N

127|console:/ # uname -a console:/ # ifconfig console:/ # ifconfig -a console:/ # ifconfig -a 130|console:/ # ifconfig usb0 192.168.42.130 console:/ # console:/ # ifconfig console:/ # iperf3 -s & iperf3 -c 192.168.42.130 -i 1 -t 30 20240921在友善之臂的…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

2.数据结构研究

计算机解决问题的步骤 线性表 树 图&#xff08;点线&#xff09;

电机纹波电流与PWM控制周期关系

目录 1 PWM控制周期的基本概念2 电机纹波电流的定义与影响3 电机纹波电流与PWM控制周期的关系4 结论 1 PWM控制周期的基本概念 PWM是一种通过微处理器的数字输出来对模拟电路进行控制的技术。在PWM中&#xff0c;周期&#xff08;T&#xff09;是指一个脉冲信号从开始到结束的…