《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://xiahunao.cn/news/2778772.html

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

相关文章

springcloud分布式架构网上商城源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

H12-821_35

35.如图所示,SWA、SWB、SWC都运行RSTP,SWB上的GEO/O/2端口和SWC上的GEO/0/1端其端口角色为? A.backup端口.Alternative端口 B.Alternative端口、Backup端口 C.Root端口、Designate端口 D.Backup端口、Root端口 答案:A 注释: 一个链路(冲突域…

hexo部署到gitee(码云)

引言 Hexo 是一个基于Node.js的静态博客框架,而 Gitee(也被称为码云)是一个国内的代码托管平台,支持 Git 版本控制系统,与 GitHub 类似。将 Hexo 部署到 Gitee Pages 可以让你的博客受益于 Gitee 的国内服务器&#xf…

python web 框架Django学习笔记

2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式,把程序或者项目分为三个主要组成部分,Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…

Open CASCADE学习|保存为STL文件

STL (Stereolithography) 文件是一种广泛用于3D打印和计算机辅助设计 (CAD) 领域的文件格式。它描述了一个三维模型的表面而不包含颜色、材质或其他非几何信息。STL文件通常用于3D打印过程中,因为它们仅包含构建物体所需的位置信息。 由于STL文件只包含表面信息&am…

《动手学深度学习(PyTorch版)》笔记8.4

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

分布式搜索引擎 elasticsearch

分布式搜索引擎 elasticsearch 第一部分 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索…

LeetCode 0094.二叉树的中序遍历:递归/迭代(栈模拟递归)

【LetMeFly】94.二叉树的中序遍历:递归/迭代(栈模拟递归) 力扣题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/ 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root […

【Qt 学习之路】在 Qt 使用 ZeroMQ

文章目录 1、概述2、ZeroMQ介绍2.1、ZeroMQ 是什么2.2、ZeroMQ 主线程与I/O线程2.3、ZeroMQ 4种模型2.4、ZeroMQ 相关地址 3、Qt 使用 ZeroMQ3.1、下载 ZeroMQ3.2、添加 ZeroMQ 库3.3、使用 ZeroMQ3.4、相关 ZeroMQ 案例 1、概述 今天是大年初一,先给大家拜个年&am…

我主编的电子技术实验手册(03)——电阻的识别与测量

本专栏是笔者主编教材(图0所示)的电子版,依托简易的元器件和仪表安排了30多个实验,主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】,精心设计的【实验步骤】,全面丰富的【思考习…

《零基础实践深度学习》实践导学 01

1.1前言 一、课程介绍 《零基础实践深度学习》(第1版)2020年正式上线,深受开发者和高校师生追捧,累积学习人数超过9万人。本课程是它的升级版,结合深度学习技术的发展、学员反馈,并结合近两年AI产业应用经…

Docker容器化K8s集群部署教程(一键部署sheel脚本)

本文通过脚本,可以快速地部署和配置Kubernetes环境,省去了各插件手动部署、配置的繁琐过程。 先看最终结果: [rootlocalhost home]# kubectl get node NAME STATUS ROLES AGE VERSION k8smaster Ready control-p…

相机图像质量研究(11)常见问题总结:光学结构对成像的影响--像差

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后,找到安装路径下,默认生成的packages文件夹,复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…

算法学习——LeetCode力扣二叉树篇2

算法学习——LeetCode力扣二叉树篇2 107. 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣(LeetCode) 描述 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层&#…

JAVA反射总结学习

初始反射反射的基本操作反射安全性问题 反射是指在Java运行状态中: 给定一个类对象(Class对象),通过反射获取这个类对象(Class对象)的所有成员结构; 给定一个具体的对象,能够动态地调用它的方法及对任意属性值进行获取和赋值; …

Popper.js:ElementUI 中采用弹出,提示框库,好用的没朋友。

Hi,我贝格前端工场,继续介绍经典的js库,ElementUI 中Tooltip、Select、Cascader、TimePicker等组件中怎么把提示框定位到目标元素的,是用 Popperjs 来实现。 一、Popper.js是什么? Popper.js是一个用于创建弹出式组件…

Duilib List 控件学习

这是自带的一个示例; 一开始运行的时候List中是空的,点击Search按钮以后就填充列表框; 先看一下列表框列头是在xml文件中形成的; <List name="domainlist" bkcolor="#FFFFFFFF" ... menu="true"> <ListHeader height="24…

MATLAB知识点: ismember函数 判断数组A中的元素是否在数组B中

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.4.5 集合运算 h ismember(A, B)可以判断数组…

vue+springboot前后端视频文件等的上传与展示(基于七牛云)

前言&#xff1a;在初步说明完成功能之前&#xff0c;我会把重要的部分说明下。后续我会细化。 vue视频文件上传 其实这里和图片这些文件就是一样的。因为上传只是把我们想在云端展示的文件按等传输到云端的bucket。然后方便网站去请求引用。 有人问我我就说明下。这种东西无…