《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.hqwc.cn/news/466547.html

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

相关文章

161基于matlab的快速谱峭度方法

基于matlab的快速谱峭度方法,选择信号峭度最大的频段进行滤波,对滤波好信号进行包络谱分析。输出快速谱峭度及包络谱结果。程序已调通,可直接运行。 161 信号处理 快速谱峭度 包络谱分析 (xiaohongshu.com)

一、部署Oracle

部署Oracle 一、Docker部署1.Oracle11g1.1 测试环境1.1.1 拉取镜像1.1.2 启动容器1.1.3 配置容器环境变量1.1.4 修改sys、system用户密码1.1.5 创建表空间1.1.6 创建用户并授权1.1.5 使用DBeaver测试连接 二、安装包部署 一、Docker部署 1.Oracle11g 1.1 测试环境 当前只能用…

3.4-媒资管理之视频处理+xx-job分布式任务

文章目录 媒资管理6 视频处理6.1 需求6.1.1 总体需求6.7.3 FFmpeg 的基本使用6.7.4 视频处理工具类 6.2 分布式任务处理6.2.1 什么是分布式任务调度6.2.2 XXL-JOB介绍6.2.3 搭建XXL-JOB6.2.3.1 调度中心6.2.3.2 执行器6.2.3.3 执行任务 6.2.4 分片广播 6.3 技术方案6.3.1 作业分…

一周学会Django5 Python Web开发-Django5操作命令

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

[CUDA 学习笔记] Reduce 算子优化

Reduce 算子优化 注: 本文主要是对文章 【BBuf的CUDA笔记】三,reduce优化入门学习笔记 - 知乎 的学习整理 Reduce 又称之为归约, 即根据数组中的每个元素得到一个输出值, 常见的包括求和(sum)、取最大值(max)、取最小值(min)等. 前言 本文同样按照英伟达官方 PP…

unity2017 遇到visual studio 2017(社区版) 30日试用期到了

安装unity2017 遇到visual studio 2017 30日试用期到了,网上百度搜了好多方法都没有成功。 最后用了这个方法: 1)启动vs2017,在弹出要登录的窗口之前,迅速的点击工具-》选项-》账户,勾选在添加账户或对账户重新进行身…

svg基础(九)滤镜-feMorphology(形态学)

feMorphology:形态学滤镜 用来侵蚀或扩张输入的图像。它在增肥或瘦身效果方面特别有用。适合用来创建轮廓和边界。 1 用法 <feMorphology operator"" radius""/>2 属性 inoperator -dilate膨胀,erode侵蚀radius- 3 示例 <svg width"50…

Linux第52步_移植ST公司的linux内核第4步_关闭内核模块验证和log信息时间戳_编译_并通过tftp下载测试

1、采用程序配置关闭“内核模块验证” 默认配置文件“stm32mp1_atk_defconfig”路径为“arch/arm/configs”; 使用VSCode打开默认配置文件“stm32mp1_atk_defconfg”&#xff0c;然后将下面的4条语句屏蔽掉&#xff0c;如下&#xff1a; CONFIG_MODULE_SIGy CONFIG_MODULE_…

LeetCode:69.x的平方根

嗨嗨嗨&#xff0c;二分又来了&#xff0c;淦它&#xff0c; 这个题官解是&#xff0c;C函数法&#xff0c;二分&#xff0c;和牛顿迭代法&#xff08;暂且搁置&#xff09;&#xff0c; 当然还有暴力&#xff08;不必讨论&#xff0c;就从0开始一个一个试&#xff09;&#…

02.12

STM32CubeMx 1.2. 3. 4. 5. 6. 7. 8. 9. 10.

王树森《RNN Transformer》系列公开课

本课程主要介绍NLP相关&#xff0c;包括RNN、LSTM、Attention、Transformer、BERT等模型&#xff0c;以及情感识别、文本生成、机器翻译等应用 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) &#xff08;一&#xff09;NLP基础 1、数据处理基础 数…

AES加密后的密码可以破解吗

AES&#xff08;高级加密标准&#xff09;是一种广泛使用的对称加密算法&#xff0c;设计用来抵御各种已知的攻击方法。AES使用固定块大小的加密块和密钥长度&#xff0c;通常是128、192或256位。它被认为是非常安全的&#xff0c;到目前为止&#xff0c;没有已知的可行方法能够…