Git使用技巧

rebase & merge

先说结论,rebase比较适用于私人分支,可以把主干分支上其他人开发的功能拉到自己的分支上,并且是一条线;merge则主要适用于主分支,可以将其他人的代码合并上去,因为要保留主分支的完整历史记录。

  • Merge

image-20240719172122859

  • rebase

    image-20240719172203192

image-20240719172215489

image-20240719172311806

squash

主要用于合并commit,简化分支。

  1. 交互式重排示例
# 进行交互式重排,假设重排最近的4个提交
git rebase -i HEAD~4

在编辑器中,将目标提交标记为 squashs(s 代表将当前提交合并到上一个提交):

pick 1234567 Add feature A
s 89abcdef Fix bug in feature A
s 4567890 Add tests for feature A
s abcdef12 Improve documentation for feature A
  1. 保存并退出。此时应该弹出合并提交信息的编辑界面,例如:
# This is a combination of 4 commits.
# The first commit's message is:
Add feature A# This is the 2nd commit message:Fix bug in feature A# This is the 3rd commit message:Add tests for feature A# This is the 4th commit message:Improve documentation for feature A# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.

编辑合并后的提交信息,例如:

Add feature A with bug fixes, tests, and documentation improvements- Add feature A
- Fix bug in feature A
- Add tests for feature A
- Improve documentation for feature A

保存并退出,这样 Git 就会完成合并提交。

此时的git log前后对比

image-20240719173622179

git diff Patch

git diffgit apply 的用法,特别是如何通过生成和应用补丁文件(patch files)在不同的分支或仓库之间传递更改。现对这段话进行详细解读:

基本用法

  1. 使用场景

git diff 可以用来创建一个补丁文件,该文件包括不同提交、分支等之间的差异。然后可以使用 git apply 将这些补丁文件应用到另一个分支或仓库中。

  1. 实际操作步骤

步骤1:创建一个包含HEAD和HEAD~5之间差异的补丁文件:

git diff HEAD~5 HEAD > my-feature.patch

这个命令生成了从 HEAD~5 (当前HEAD的前五个提交) 到 HEAD 之间的差异,并将这些差异输出到名为 my-feature.patch 的文件中。

步骤2:将当前工作目录中的更改写入一个补丁文件:

git diff > my-changes.patch

这个命令将当前工作目录中的未提交更改记录到名为 my-changes.patch 的文件中。

步骤3:在新分支中应用补丁文件:

git apply my-feature.patch

这个命令应用 my-feature.patch 中记录的更改到当前工作目录或暂存区。

主要用途

  • 生成补丁文件:使用 git diff 生成补丁文件,可以记录不同提交、分支、工作目录之间的差异。
  • 应用补丁文件:使用 git apply 应用补丁文件,可以将其他分支或仓库中的更改引入当前工作目录或暂存区。
  • 共享代码更改:补丁文件非常适合在不依赖多次提交或创建分支的情况下共享代码更改。
  1. 应用实例

例如,在某个迁移项目中,频繁使用 git diff 补丁文件。先将提交导入到另一个存储库(DYEH repo),然后创建补丁文件,最后在第二个存储库(TTEH repo)中应用补丁文件,从而实现代码的迁移。

这个过程可以总结如下:

  1. 通过 git diff 生成补丁文件,记录两个提交、分支或版本之间的差异。
  2. 将生成的补丁文件应用到目标分支或仓库中,确保差异能够被正确合并。

通过这种方式,可以高效地在项目之间迁移或共享代码更改,而无需直接操作多次提交或创建额外分支。

git bisect ——二分查找debug

说白了就是使用二分查找定位bug点,先分别标记goodbad两个commit点,然后git会自动把状态恢复到中间的commit状态,我们在这里检查一下,然后可以判断好坏,如果是好,则会跳到下一个二分查找点。

bisect 是 Git 提供的一个功能,用于在大型代码库中快速定位引入错误的提交。通过二分查找算法,它能够在一系列提交中迅速找到导致问题的那一个。这个工具对于调试引入问题的提交非常有用,可以显著减少需要检查的提交数量。

基本用法

  1. 启动 git bisect

    命令:

    git bisect start
  2. 标记坏的提交

    命令:

    git bisect bad

    使用 git bisect bad 告诉 git bisect 目前的代码状态是有问题的,即指出坏的提交(通常是当前的 HEAD)。

  3. 标记好的提交

    命令:

    git bisect good <commit>

    使用 git bisect good <commit> 告诉 git bisect 一个已知的良好提交,这样 Git 就可以确定搜索的范围。<commit> 可以是提交哈希、分支、标签等。

  4. Git Bisect 开始搜索

    git bisect 会切换到两个提交中间的那个提交点,然后你需要测试该提交中的代码是否有问题:

    • 如果测试后发现有问题,运行:
      git bisect bad
    • 如果测试后发现没有问题,运行:
      git bisect good

    Git 会重复该过程,继续在剩余的提交中间点切换,直到找到引入问题的提交为止。

  5. 找到问题提交并结束 git bisect

    git bisect 找到导致问题的提交后,可以使用以下命令结束二分查找过程:

    git bisect reset

    这会将当前工作目录恢复到 git bisect 启动之前的状态。

PS:

在自动化测试环境中,可以使用 git bisect run 命令配合脚本自动化测试。例如:

git bisect start
git bisect bad
git bisect good v1.0
git bisect run ./test_script.sh

其中 ./test_script.sh 是一个返回状态码的脚本,非零状态码表示错误,零表示正常。

通过 git bisect,你可以更快捷地定位回归问题,大大提高了调试和修复代码的效率。

cherry-pick (cross-repo)

git cherry-pick 是一个非常有用的 Git 命令,它可以让你从一个分支中挑选特定的提交(commit)并将它们应用到当前分支。这个命令在团队协作或处理多个功能分支时特别有用,当你需要从不同的分支中复制已存在的修改时,不必合并整个分支。

使用场景

  • 从功能分支中挑选特定提交应用到主分支
  • 在一个修复分支中选择特定的修复提交应用到其他分支
  • 将特定改动引入到当前正在开发的功能分支中

基本用法

  1. 切换到目标分支

    首先,切换到你希望应用提交的目标分支。例如,你要将提交应用到 main 分支:

    git checkout main
  2. 执行 cherry-pick 操作

    使用 git cherry-pick 命令选择特定提交并将其应用到当前分支。你可以通过提交哈希(SHA1)指定提交:

    git cherry-pick <commit-hash>

    例如:

    git cherry-pick a1b2c3d4

    这将把 a1b2c3d4 提交的更改应用到当前所在的分支。

高级用法

  1. 挑选多个提交

    你可以一次挑选多个连续的提交,使用提交范围:

    git cherry-pick <start-commit>^..<end-commit>

    例如:

    git cherry-pick a1b2c3d4^..d5e6f7g8

    这样会将从 a1b2c3d4 之后(包含)的提交到 d5e6f7g8 的所有提交依次应用到当前分支。

  2. 挑选非连续的多个提交

    你可以使用多次 git cherry-pick 命令,或者一次性应用多个单独的提交:

    git cherry-pick <commit-hash1> <commit-hash2> <commit-hash3>

    例如:

    git cherry-pick a1b2c3d4 e5f6g7h8 i9j0k1l2
  3. 解决冲突

    cherry-pick 操作过程中,如果遇到冲突,Git 会提示你解决冲突。你需要手动解决文件中的冲突,然后继续 cherry-pick 操作:

    git add <resolved-files>
    git cherry-pick --continue

    如果想中止 cherry-pick 操作,可以使用:

    git cherry-pick --abort
  4. 自动提交信息

    通常,cherry-pick 会保留原提交的提交信息。如果你想修改提交信息,可以使用 -e 选项:

    git cherry-pick -e <commit-hash>
  5. 签名提交

    如果你想签名 cherry-pick 提交,可以使用 -s 选项:

    git cherry-pick -s <commit-hash>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873986.shtml

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

相关文章

JavaWeb笔记_Cookie

一.会话技术概述 在日常生活中,A和B之间在打电话过程中一连串的你问我答就是一个会话 在BS模型中,会话可以理解为通过浏览器访问服务端的资源,点击超链接可以进行资源的跳转,直到浏览器关闭过程叫做会话 我们使用会话技术可以解决的是整个会话过程中(通过浏览器浏览服务…

css-01-如何实现“文本过长(文本在一行排),超出部分被省略号代替”

目录 需求代码代码解释 需求 最近写一个项目&#xff0c;遇到了一个问题&#xff0c;就是希望实现下面这种文字效果&#xff1a;文字在一行排&#xff0c;超出的部分用省略号代替 代码 <!DOCTYPE html> <html lang"en"><head><meta charset…

【芯片设计- RTL 数字逻辑设计入门 番外篇 12 -- SoC 设计中的 ECO】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 请阅读【芯片设计 RTL 数字逻辑设计扫盲 】 转自&#xff1a;简单了解SoC设计中的ECO — 快乐的芯片工程师 文章目录 ECO 概述Pre-Mask ECO&#xff08;预掩模ECO&#xff09;芯片设计前端与后端的区别 Post-Mask ECO&#xff08;后…

IAR环境下STM32+IAP方案的实现

--基于STM32F103ZET6的UART通讯实现 一、什么是IAP&#xff0c;为什么要IAP IAP即为In Application Programming(在应用中编程)&#xff0c;一般情况下&#xff0c;以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了&#xff0c;如果在设备使…

BM34 判断是不是二叉搜索树

1.题目描述 给定一个二叉树根节点&#xff0c;请你判断这棵树是不是二叉搜索树。 二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。 例&#xff1a; 图1 图2 数据范围&#xff1a;节点数量满足 1≤&#x1d45b;≤104 1≤n≤104…

SpringMVC的底层工作原理?

1.用户发送请求至前端控制器DispatcherServlet. 2.DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器 3.HandlerMapping找到具体的处理器(可以根据 xml 配置、注解进行查找&#xff09;&#xff0c;生成处理器及处理器拦截器(如果有则生成)一并返回给DispatcherSe…

AI赋能下的人体摔倒识别技术:深度解析与应用前景

引言 随着人工智能技术的快速发展&#xff0c;AI赋能的解决方案在各行各业中展现出巨大的潜力。特别是在安全监控和健康护理领域&#xff0c;AI技术的应用不仅提高了效率&#xff0c;还极大地提升了安全性。本文将深入探讨思通数科&#xff08;南京&#xff09;信息技术有限公…

【Matlab】RBF径向基神经网络回归预测算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/89564332 资源合集&#xff1a; https://download.csdn.net/download/vvoennvv/89564427 目录 【Matlab】BP 神经网络回归预测算法 【Matlab】CNN-LSTM回归预测 卷积神经网络-长短期记忆神经网络组合模型 …

昇思学习打卡-23-生成式/CycleGAN图像风格迁移互换

文章目录 模型介绍网络结构数据集可视化网络的其他细节模型推理 模型介绍 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Do…

vue 侧边锚点外圆角

环境&#xff1a;uniapp、vue3、unocss、vant4 效果&#xff1a; 代码 主要是&#xff1a;pointTop 、pointCentent 、pointBottom&#xff0c;这三个样式 html <div v-show"!showPoint" class"fixedLeftDiv"><div><div class"pointT…

XXE:XML外部实体引入

XXE漏洞 如果服务器没有对客户端的xml数据进行限制&#xff0c;且版本较低的情况下&#xff0c;就可能会产生xxe漏洞 漏洞利用流程 1.客户端发送xml文件&#xff0c;其中dtd存在恶意的外部实体引用 2.服务器进行解析 3.服务器返回实体引用内容 危害&#xff1a;任意文件读…

代码:前端与数据库交互的登陆界面

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>登录</title> </head> <body>…

【Linux 14】进程间通信概念

文章目录 &#x1f308; 一、进程间通信的目的&#x1f308; 二、进程间通信的理解&#x1f308; 三、进程间通信的分类 &#x1f308; 一、进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通…

Java GC(垃圾回收)机制详解

Java GC&#xff08;垃圾回收&#xff09;机制详解 1、GC触发的条件2、GCRoots的对象类型 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java的世界里&#xff0c;内存管理是自动进行的&#xff0c;其中垃圾回收&#xff08;Garbage Col…

【JAVA多线程】Future,专为异步编程而生

目录 1.Future 2.CompletableFuture 2.1.为什么会有CompletableFuture&#xff1f; 2.2.使用 2.2.1.提交任务获取结果 2.2.2.回调函数 2.2.3.CompletableFuture嵌套问题 1.Future Java中的Future接口代表一个异步计算。其提供了一组规范用来对异步计算任务进行管理控制…

PACS-医学影像信息管理系统,全影像科室PACS源码,内置包括MPR、CMPR、VR等三维处理功能

PACS系统可以覆盖医院现有放射、CT、MR、核医学、超声、内镜、病理、心电等绝大部分DICOM和非DICOM检查设备&#xff0c;支持从科室级、全院机、集团医院级乃至到区域PACS的平滑扩展&#xff0c;能够与医院HIS、集成平台的有效集成和融合&#xff0c;帮助医院实现了全院医学影像…

Qt Style Sheets-使用样式表自定义 Qt 部件

使用样式表自定义 Qt 部件 在使用样式表时&#xff0c;每个小部件都被视为具有四个同心矩形的框&#xff1a;边距矩形、边框矩形、填充矩形和内容矩形。框模型对此进行了更详细的描述。 盒模型 以下是四个同心矩形在概念上的呈现方式&#xff1a; 边距超出边框。边框绘制在边…

【深入C++】二叉搜索树

文章目录 什么是二叉搜索树二叉搜索树的接口1.查找操作2.插入操作3.中序遍历4.删除操作 所有代码总结 什么是二叉搜索树 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0c;其每个节点最多有两个子节点&#xff0c;分别称为左子节点和…

Linux环境下dockes使用MongoDB,上传zip文件如何解压并备份恢复到MongoDB数据库中

1、准备 Docker 和 MongoDB 容器 建议主机端口改一下 docker run --name mongodb -d -p 27018:27017 mongo 2. 创建一个工作目录并将 zip 文件上传到dockers容器中 docker cp data.zip mongodb:/data.zip 3. 在 MongoDB 容器中解压 zip 文件&#xff08;也可以解压完再复制…

基础vrrp(虚拟路由冗余协议)

一、VRRP 虚拟路由冗余协议 比如交换机上联两个路由器&#xff0c;由两个路由虚拟出一台设备设置终端设备的网关地址&#xff0c;两台物理路由的关系是主从关系&#xff0c;可以设置自动抢占。终端设备的网关是虚拟设备的ip地址&#xff0c;这样&#xff0c;如果有一台路由设备…