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

news2024/11/23 7:59:04

在这里插入图片描述

文章目录

  • 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 ]; then
    echo "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.coloradmin.cn/o/1445920.html

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

相关文章

npm install 安装依赖如何加速

在使用npm安装依赖时,有几种方法可以加速这一过程,尤其是在面临网络限制或npm官方源速度慢的情况下。以下是一些常用的加速技巧: 1. 使用国内镜像源 国内有几个镜像源可以提供更快的下载速度,例如淘宝npm镜像。你可以通过以下命…

操作系统基础:IO核心子系统【下】

🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 🏆🏆本文完整PDF源文件请翻阅至文章底部下载。🏆🏆 ⚕️1 I/O核心子系统——概述🔱1.1 核心子系统要完成的功能…

【教学类-48-03】202402011“闰年”(每4年一次 2月有29日)世纪年必须整除400才是闰年)

2000-2099年之间的闰年有25次, 背景需求: 已经制作了对称年月的数字提取,和年月日相等的年份提取 【教学类-48-01】20240205对称的“年”和“月日”(如2030 0302)-CSDN博客文章浏览阅读84次。【教学类-48-01】202402…

SpringCloud-项目引入Nacos

一、安装Nacos服务 首先,我们需要从 Nacos 的官方网站下载发布版本。下载地址:Releases alibaba/nacos GitHub 选择合适的版本并下载,解压缩得到 Nacos 的安装包。 在解压后的 Nacos 目录中,找到 bin 文件夹。 用写字板编辑…

【Effective Objective - C 2.0】——读书笔记(二)

文章目录 前言六、理解“属性”这一概念七、在对象内部尽量直接访问实例变量八、理解“对象等同性”这一概念九、以“类族模式”隐藏实现细节十、在既有类中使用关联对象存放自定义数据十一、理解objc_msgSend的作用十二、理解消息转发机制动态方法解析备援接受者完整的消息转发…

Nginx实战:3-日志按天分割

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、方式1:定时任务执行分割脚本 1.分割日志脚本 2.添加定时任务 二、方式2:logrotate配置分割 1.logrotate简单介绍 2.新增切割ngi…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

(2)长距离

文章目录 2.1 Andruav Android Cellular 2.2 Blicube RLINK P900 2.3 ClearSky Airlink 4G LTE遥测技术 2.4 CRSF/ELRS Telemetry 2.5 CUAV P8 Radio 2.6 CUAV P9 Radio 2.7 DragonLink 2.8 Holybro 900Mhz XBP9X无线电遥测设备 2.9 Holybro Microhard P900无线电遥测…

嵌入式Qt Qt Creator安装与工程介绍

一.Qt概述 什么是Qt:Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 二.Qt Creator下载安装 下载地址:Index of /a…

HarmonyOS ArkTS修改App的默认加载的界面(二十)

前言&#xff1a;在Android开发中想要修改默认启动页&#xff0c;只需要在AndroidManifest.xml中设置即可 只需要在启动的activity种添加如下属性即可 <intent-filter><action android:name"android.intent.action.MAIN" /><category android:name&qu…

Windows - URL Scheme - 在Windows上无管理员权限为你的程序添加URL Scheme

Windows - URL Scheme - 在Windows上无管理员权限为你的程序添加URL Scheme What 想不想在浏览器打开/控制你的电脑应用&#xff1f; 比如我在浏览器地址栏输入wegame://后回车会提示是否打开URL:wegame Portocol。 若出现了始终允许选项&#xff0c;你甚至可以写一个Web界面…

洛谷: P1308 [NOIP2011 普及组] 统计单词数

前言: 这道题没理解清题目表达意思&#xff0c;我开始想的是用map来记录个数&#xff0c;然后一个变量记录一开始出现的单词位置&#xff0c;不挺简单的吗&#xff0c;然后....就AC了2个..从错误提示能看到个数没啥问题&#xff0c;但是第一个单词位置不对&#xff0c;看了新样…

HDFS架构 之 服务视图

1 、简介 为实现以上特性,HDFS包含的各个服务模块都是经过精心设计的,HDFS的服务视图如图。 HDFS的服务视图包含三大部分:核心服务、公共服务和拓展服务。 2、 核心服务 1)Namenode。HDFS系统采用中心化设计,即Master/Slave架构。这里的Namenode即是Master,主要作用是管…

【实战】一、Jest 前端自动化测试框架基础入门 —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

[2024]常用的pip指令

[2024]常用的pip指令 HI&#xff0c;这里是肆十二&#xff0c;好久不见&#xff0c;大家&#xff01; 新年好&#xff01; pip是Python的包管理工具&#xff0c;它可以用来安装、升级、卸载Python包。以下是一些常用的pip指令&#xff1a; 安装包&#xff1a; bash复制代码…

一个三极管引脚识别的小技巧,再也不用对照手册啦

三极管是一个非常常用的器件,时不时的就需要用到他们,有些时候当我们拿到一颗三极管时 ,对于常用的友来说,三极管的引脚可能早已烂熟于心,而对于不常用或者初学者来说,三极管的引脚可以说是今天记下明天忘,后天搞混大后天重看手册(玩笑话),但是这种情况可以说每个人都…

javaEE - 22( 5000 字 Tomcat 和 HTTP 协议入门 -3)

一&#xff1a;Tomcat 1.1 Tomcat 是什么 谈到 “汤姆猫”, 大家可能更多想到的是大名鼎鼎的这个: 事实上, Java 世界中的 “汤姆猫” 完全不是一回事, 但是同样大名鼎鼎. Tomcat 是一个 HTTP 服务器. 前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和…

4核8g服务器能支持多少人访问?2024新版测评

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

基于VUE框架的旅游平台82070-计算机毕业设计项目选题推荐(免费领源码)

摘 要 改革开放以来&#xff0c;我国的旅游业有了非常迅速的发展&#xff0c;但是比较而言&#xff0c;我国国内旅游业发展的广度深度都远远不能适应经济发展和人民生活水平提高的需要。随着市场经济的发展和人民收入水平的进一步提高&#xff0c;人民对旅游消费的需求将进一步…

贪吃蛇的实现,基于windows操作系统

前言&#xff1a; 贪吃蛇从学习到真正实现花了9天实现&#xff0c;第一二天第一次学习&#xff0c;第三四五天第二次学习&#xff0c;第六七八天一边实现一边思考&#xff0c;才完成了贪吃蛇的代码。实现了贪吃蛇以后已经接近过年&#xff0c;我想自己再根据掌握的知识制作烟花…