《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)

在这里插入图片描述

文章目录

  • 5.1 交互式暂存
    • 5.1.1 基础知识讲解
    • 5.1.2 重点案例:为 Python 项目分阶段提交
    • 5.1.3 拓展案例 1:细粒度控制更改
    • 5.1.4 拓展案例 2:处理遗漏的更改
  • 5.2 使用 Rebase 优化提交历史
    • 5.2.1 基础知识讲解
    • 5.2.2 重点案例:整理 Python 项目的提交历史
    • 5.2.3 拓展案例 1:解决 Rebase 过程中的冲突
    • 5.2.4 拓展案例 2:使用 Rebase 精简提交
  • 5.3 钩子脚本自动化工作流
    • 5.3.1 基础知识讲解
    • 5.3.2 重点案例:自动运行 Python 单元测试
    • 5.3.2 拓展案例 1:自动检查 Python 代码风格
    • 5.3.4 拓展案例 2:使用钩子自动部署应用

5.1 交互式暂存

交互式暂存是 Git 中一个强大的特性,允许你精确控制哪些更改应该被提交。这对于保持提交历史的清晰和有意义非常有帮助,尤其是当你在一个大型提交中做了多项不相关的更改时。

5.1.1 基础知识讲解

  • 交互式暂存使用:通过 git add -pgit add --patch 命令启动,Git 会将文件更改分成小块(称为 “hunks”)。对于每个块,Git 会询问你是否要暂存它、编辑它、忽略它,或者将更改分割得更细。
  • 选择更改:在交互式模式中,你可以选择暂存全部更改、某些特定的更改,或者甚至是一个大更改中的一小部分。
  • 暂存策略:这种方式特别适用于当你的工作包含多个逻辑上独立的更改,但你想在不同的提交中分别提交它们。

5.1.2 重点案例:为 Python 项目分阶段提交

假设你正在开发一个 Python 项目,你在过去几个小时内完成了两项工作:一是优化了现有功能的性能,二是修复了一个长期存在的 bug。

步骤 1:开始交互式暂存

你的更改散布在几个文件中,但你想分两个提交分别提交它们。

git add -p

Git 逐一展示每个更改,让你决定是否暂存。

步骤 2:选择性暂存优化更改

首先,你只选择与性能优化相关的更改进行暂存。对于每个展示的块,只有当它与性能优化相关时,你才选择 “y”(是)。

步骤 3:提交优化更改

完成暂存后,你提交了这部分更改:

git commit -m "Optimize existing functionality for better performance"

5.1.3 拓展案例 1:细粒度控制更改

在某些情况下,一个文件中的一个更改可能同时包含你希望提交和你希望暂时保留的更改。通过选择 e(编辑)选项,你可以手动编辑每个块,只保留你想要暂存的那部分。

5.1.4 拓展案例 2:处理遗漏的更改

完成性能优化的提交后,你记得还有一个小改进没有包括在内。你再次运行 git add -p,找到那个遗漏的更改,将其加入到下一个提交中,这次是关于修复 bug 的。

通过这一节,你学会了如何利用交互式暂存来精确控制你的提交内容,这不仅可以让你的提交历史更加清晰,还能在团队合作中减少混乱。记住,一个好的提交历史就像是一个好的故事,它应该清晰、连贯,每次提交都有其目的和理由。现在,就让我们用这些技巧来编织我们代码的故事吧!

在这里插入图片描述


5.2 使用 Rebase 优化提交历史

在 Git 的世界里,rebase 是一种强大的魔法,可以帮助你重新书写代码的历史。不是真的改变过去,而是让提交历史更加整洁和有序。通过 rebase,你可以将一系列的提交重新基于另一个分支的顶部,或者整理你自己的提交历史,使其更加清晰。

5.2.1 基础知识讲解

  • 什么是 Rebaserebase 允许你将一个分支的更改重新应用到另一个分支上。与合并(merge)不同,rebase 通过重新创建更改在新的基础上,使得历史成为一条直线,避免了不必要的合并提交。
  • 使用场景rebase 最常见的使用场景包括:将本地分支更新到最新的主分支状态,以及在将更改合并到主分支前清理提交历史。
  • 交互式 Rebasegit rebase -i 允许你交互式地选择每个提交进行重新排序、合并、编辑或删除。这是优化你的提交历史的强大工具。

5.2.2 重点案例:整理 Python 项目的提交历史

假设你正在开发一个 Python 项目,并在 feature-branch 上进行了一系列的提交,包括一些新功能的添加和几个 bug 的修复。

步骤 1:开始交互式 Rebase

你想在将这个分支合并到 main 前整理你的提交历史:

git checkout feature-branch
git rebase -i main

这会打开一个编辑器,列出了你准备重新整理的所有提交。

步骤 2:重新排序和合并提交

在编辑器中,你决定将一些小的 bug 修复合并成一个单独的提交,并将一些相关的更改放在一起。

5.2.3 拓展案例 1:解决 Rebase 过程中的冲突

rebase 过程中,你遇到了一些冲突。Git 会停下来让你解决冲突,然后继续 rebase 流程:

# 解决所有冲突
git add .
git rebase --continue

如果任何时刻你决定这个 rebase 是个坏主意,你可以通过 git rebase --abort 来取消整个操作。

5.2.4 拓展案例 2:使用 Rebase 精简提交

在开发一个新的数据处理功能时,你创建了多个“探索性”的提交,现在你希望在合并到 main 分支前将它们精简成更少的、更有意义的提交。

git rebase -i HEAD~5

你选择了 squash 选项来合并这些提交,并为合并后的提交编写了一个清晰的消息,说明了这个功能的实现和目的。

通过这一章,你已经学到了如何使用 rebase 来优化你的提交历史,让它更加清晰和有序。记住,一个好的提交历史不仅能帮助你和你的团队更好地理解项目的发展过程,还能在需要追踪问题时,提供极大的帮助。现在,拿起你的魔法杖,开始使用 rebase 来整理你的代码历史吧!

在这里插入图片描述


5.3 钩子脚本自动化工作流

在 Git 的魔法世界中,钩子脚本(Git hooks)是那些藏在幕后的小精灵,它们在 Git 操作的特定时刻悄悄地执行任务,从而自动化你的开发工作流。这些脚本可以帮助你自动运行测试、检查代码风格、甚至自动部署应用,让你的开发过程更加高效和规范。

5.3.1 基础知识讲解

  • Git 钩子类型:Git 提供了多种钩子,例如 pre-commitpost-commitpre-push 等,分别在不同的操作前后触发。
  • 钩子脚本位置:这些脚本位于 Git 仓库的 .git/hooks 目录下。默认情况下,Git 提供了一些示例脚本,但它们默认是禁用的(文件名以 .sample 结尾)。
  • 激活钩子脚本:要启用一个钩子脚本,你需要移除文件扩展名 .sample,并确保该脚本是可执行的。

5.3.2 重点案例:自动运行 Python 单元测试

假设你正在开发一个 Python 项目,并希望在每次提交前自动运行单元测试,确保只有通过所有测试的代码才能被提交。

步骤 1:创建 pre-commit 钩子

.git/hooks 目录下创建一个名为 pre-commit 的文件(无文件扩展名),并添加以下内容:

#!/bin/sh
pytest

步骤 2:使钩子脚本可执行

通过运行以下命令,使得 pre-commit 钩子脚本可执行:

chmod +x .git/hooks/pre-commit

现在,每次执行 git commit 命令前,pytest 将自动运行。如果测试失败,提交将被阻止。

5.3.2 拓展案例 1:自动检查 Python 代码风格

想要在提交前自动检查代码风格,确保代码符合 PEP 8 规范?你可以在 pre-commit 钩子中集成 flake8

更新你的 pre-commit 钩子脚本,包含以下内容:

#!/bin/sh
flake8 .
if [ $? -ne 0 ]; thenecho "Code style checks failed, commit aborted."exit 1
fi

这样,只有当你的代码完全符合 PEP 8 规范时,才能成功提交。

5.3.4 拓展案例 2:使用钩子自动部署应用

如果你的项目被部署在一个可以通过 Git 钩子自动更新的服务器上,你可以使用 post-receive 钩子来自动部署应用。

在服务器的裸仓库(bare repository)中的 .git/hooks 目录下创建 post-receive 钩子,包含如下内容:

#!/bin/sh
GIT_WORK_TREE=/path/to/your/deployment/directory git checkout -f

这样,每当你向这个仓库 push 更改时,post-receive 钩子会自动将更改检出到部署目录。

通过这一章,你已经探索了如何使用 Git 钩子脚本自动化你的开发工作流,从自动运行测试到代码风格检查,再到自动部署应用。记住,利用这些小精灵的力量,你可以将重复的任务自动化,让你有更多时间专注于创造伟大的代码。现在,让我们继续探索 Git 的更多秘密,让你的开发之旅更加顺畅!

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

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

相关文章

【工作学习 day04】 9. uniapp 页面和组件的生命周期

问题描述 uniapp常用的有:页面和组件,并且页面和组件各自有各自的生命周期函数,那么在页面/组件请求数据时,是用created呢,还是用onLoad呢? 先说结论: 组件使用组件的生命周期,页面使用页面的…

通俗易懂:快速排序算法全解析

快速排序(Quick Sort)是一种高效的分治排序算法,它以其出色的性能和广泛的应用而闻名。本文将深入讲解快速排序的原理、步骤和时间复杂度,并探讨其优势和应用场景。 快速排序原理 快速排序的核心思想是通过选择一个基准元素&…

Go语言每日一练——链表篇(四)

传送门 牛客面试笔试必刷101题 ----------------合并两个排序的链表 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(2)

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

Sqlite3安装步骤

1、Sqlite3以下载文件,配置环境变量的方式进行安装。 2、下方链接为官方的下载地址。 sqlite下载地址 2.1、需要两个下载文件,解压后将他们放在一起,假设解压后的路径为E:\sqlite。 sqlite-dll-win-x64-3450100.zip sqlite-tools-win-x6…

【数据结构】数据结构

本文是基于中国MOOC平台上,华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记,便于后期讲行系统性查阅和复习。 从个人感受而言,华中科技大学的课程讲解更适合初学者(缺点在于,从概念到…

linux 07 存储管理

02. ext4是一种索引文件系统 上面是索引节点inode,存放数据的元数据 下面是存储块block,主要存放有关的信息 03.linux上的inode 查看文件中的inode ll -i 文件名 磁盘中的inode与文件数量

STM32学习笔记——定时器

目录 一、定时器功能概述 1、基本定时器(TIM6&TIM7) 工作原理 时序 2、通用计时器(TIM2&TIM3&TIM4&TIM5) 时钟源 外部时钟源模式1&2 外部时钟源模式2 外部时钟源模式1 定时器的主模式输出 输入捕获…

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 Spark新特性 自适应查询(SparkSQL) 动态合并 动态调整Join策略 …

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…

js中new操作符详解

文章目录 一、是什么二、流程三、手写new操作符 一、是什么 在JavaScript中,new操作符用于创建一个给定构造函数的实例对象 例子 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) …

编曲学习:旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧

旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65be1ba7e4b064a83b92a3d7?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv文档https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_pro/cour…

【Larry】英语学习笔记语法篇——从句=连词+简单句

目录 三、从句连词简单句 1、必须有连词 主从结构 疑问词的词性 2、名词性从句 同位语从句 形式主语 形式宾语 that的省略 3、形容词性从句(上) 关系代词 关系词的作用 介词前置问题 4、形容词性从句(中) 定语关系…

【开源】SpringBoot框架开发医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

vue3 之 商城项目—home

home—整体结构搭建 根据上面五个模块建目录图如下&#xff1a; home/index.vue <script setup> import HomeCategory from ./components/HomeCategory.vue import HomeBanner from ./components/HomeBanner.vue import HomeNew from ./components/HomeNew.vue import…

基于SSM的网络在线考试系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的网络在线考试系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

文章目录 6.1 设置和管理复制6.1.1 基础知识6.1.2 重点案例&#xff1a;使用 Python 设置 MySQL 主从复制6.1.3 拓展案例 1&#xff1a;自动故障转移6.1.4 拓展案例 2&#xff1a;设置双主复制 6.2 复制的类型和策略6.2.1 基础知识6.2.2 重点案例&#xff1a;使用 Python 设置半…

架构整洁之道-软件架构-测试边界、整洁的嵌入式架构、实现细节

6 软件架构 6.14 测试边界 和程序代码一样&#xff0c;测试代码也是系统的一部分。甚至&#xff0c;测试代码有时在系统架构中的地位还要比其他部分更独特一些。 测试也是一种系统组件。 从架构的角度来讲&#xff0c;所有的测试都是一样的。不论它们是小型的TDD测试&#xff…

windowsserver 2016 PostgreSQL9.6.3-2升级解决其安全漏洞问题

PostgreSQL 身份验证绕过漏洞(CVE-2017-7546) PostgreSQL 输入验证错误漏洞(CVE-2019-10211) PostgreSQL adminpack扩展安全漏洞(CVE-2018-1115) PostgreSQL 输入验证错误漏洞(CVE-2021-32027) PostgreSQL SQL注入漏洞(CVE-2019-10208) PostgreSQL 安全漏洞(CVE-2018-1058) …

数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)

数据库管理145期 2024-02-06 数据库管理-第146期 最强Oracle监控EMCC深入使用-03&#xff08;20240206&#xff09;1 概览2 性能中心3 性能中心-Exadata总结 数据库管理-第146期 最强Oracle监控EMCC深入使用-03&#xff08;20240206&#xff09; 作者&#xff1a;胖头鱼的鱼缸&…