打造干净的Git历史:本地仓库整理操作详解

news2024/9/29 0:48:39

让你的Git提交如行云流水:本地仓库整理指南

  • 一、背景
  • 二、整理上一次提交
  • 三、整理多次提交
  • 四、注意事项
  • 五、总结

一、背景

为什么需要本地仓库整理操作呢?
因为本地仓库提交到远程仓库是无法撤回的,只能是从远端仓库拉取数据到本地,然后对相关数据进行回退,最后再提交到远端仓库。

为什么远端仓库不能撤回?
因为已经提交到远端仓库的数据可能已经别别人拉取并进行修改了,因此,我们不能把提交到远端的数据进行撤销操作。只能重新拉取下来,修改相关数据,再提交一次。
在这里插入图片描述

什么是整理操作?
本地仓库可能存在多次的提交记录,其中可能包括很多无意义的提交,因此,在将本地的修改推送到远端之前,本地需要先做一个整理,把多个提交记录合并成一个或者修改提交记录的内容等等。

在这里插入图片描述

二、整理上一次提交

整理上一次提交” 通常是指对最近一次提交进行修改或优化,主要使用git commit --amend命令完成。包括:

  1. 修改提交信息:更改上一次提交时填写的提交信息,可以使用以下命令:

    git commit --amend -m "新的提交信息"
    

    如果是复用提交记录,可以不带-m参数,这时会进入编辑器状态。

  2. 添加遗漏的文件:如果在上一次提交后意识到还有文件没有被提交,可以先将这些文件添加到暂存区,然后使用 --amend 将它们合并到上次提交中:

    git add 忘记的文件
    git commit --amend
    
  3. 修改提交的内容:类似于添加文件,你也可以修改文件的内容,然后执行 git commit --amend,这会将更改合并到上一次提交中。

三、整理多次提交

整理多次提交” 通常是指对多个提交进行重写、合并、修改或优化。最常见的是使用交互式变基(interactive rebase)方式实现。

交互式变基主要用于:

  • 整理提交历史:合并多个提交为一个提交,消除多余的提交,保持代码库的整洁。
  • 修改提交信息:更新已有的提交信息,以反映更准确的变更描述。
  • 修改提交内容:在变基过程中,可以对某个提交进行编辑,修复错误或添加更改。
  • 重新排序提交:可以更改提交的顺序,以确保提交历史的逻辑性和连贯性。

整理多次提交 非常重要,因为在分支操作和解决冲突时非常有用。对于协作开发来说,当产生冲突之后,可能会影响我们制定规则的提交序列,因此,可能需要将产生冲突的文件合并到某个提交中,这时候就需要整理多次提交。

整理多次提交的实现方式:

  1. 交互式变基(Interactive Rebase):通过执行命令 git rebase -i HEAD~n,可以对最近的 n 次提交进行整理。在交互式模式下,可以选择对每个提交执行不同的操作,例如:

    • pick:保留该提交。
    • squash:将该提交与前一个提交合并。
    • edit:修改该提交。
    • reword:修改该提交的提交信息。
    • drop:丢弃该提交。
  2. 合并提交(Squash):通过将多个提交合并为一个,也就是将几个小的、相关的提交整合为一个更大的提交,从而使历史记录更加简洁。

  3. 重新排序提交:可以改变提交的顺序,以确保日志是按逻辑顺序排列的。

  4. 修复提交:如果在多个提交中发现错误,可以通过整理提交来修复历史记录。

这里重点讲一下交互式变基 方式,因为这是最常用的。使用交互式变基 整理多次提交的语法:

# 修改hash1之后的提交信息(不包含hash1)
git rebase -i hash1
# 修改hash1到hash2的提交信息(不包含hash1)
git rebase -i h1 h2

h1是指hash1,h2是指hash2,也就是commit的版本号,这是一个左开右闭的区间。因为我们总是基于上一次修改下一次,可能要使用到git commit -amend命令,所以区别必须 左开右闭

如果git rebase -i后面不跟任何的hash值,默认整理的就是上一次push到远端的版本到最近的一个commit版本。

在修改提交的时候,只能使用两个命令:git commit --amendgit rebase --continue;并且进入REBASE状态(即变基状态)。
在这里插入图片描述
进入REBASE状态后,就可以修改文件,然后git add到暂存区,再使用git commit --amend整理到本地仓库。整理完成之后,使用git rebase --continue继续(因为可能会有多个REBASE,如果有多个REBASE就要按照需要重复前面的整理操作),直到回到master分支。

这里再提一下另一个实际工作中常见的整理操作:合并提交(Squash)。这个同样要用到交互式变基,合并多个提交时使用 squash操作,修改为squash操作后需要重新写提交记录。

整理操作也可以借助Git可可视化工具完成,比如 SourceTree、TortoiseGit(小乌龟)

整理多次提交的好处:

  1. 简化历史:将多个小提交合并为一个有意义的提交,使得提交历史更加清晰、易读。

  2. 提高可理解性:清晰的提交记录使得团队成员能够更容易理解每个变更的意图,容易查找问题。

  3. 减少“噪音”:避免提交日志中充斥着很多小的、细微的提交(如“修复错误”、“更新文档”等),提高版本控制的质量。

  4. 修复错误:如果某个提交包含错误,通过整理可以修复该提交,保持历史的清晰性。

  5. 增强代码审查:整理后的提交在进行代码审查时,能够更加方便审查者理解每个提交的改动。

  6. 避免冲突:在合并分支时,明确的提交历史可以减少后续合并时可能出现的冲突。

四、注意事项

进行整理操作的时候,必须是自己的仓库,也就是别人不会依赖你的仓库。因为作为开发者,都会有一个自己的功能分支,这个分支是自己私有的,不会被别人依赖。

千万不要在develop分支或者master分支做变基操作,因为从变基那个节点开始往后的所有节点的commit id都会发生变化,如果被别人依赖的话,会造成别人依赖一个不存在的提交,会引发其他人冲突。

正常的开发流程都是从develop分支或者master分支创建一个属于自己的私有分支,不被其他人依赖。在已经推送到共享或公共仓库的分支上避免进行变基或重写历史,以免引起混乱。

在完成整理操作后,使用 git loggit reflog 查看提交历史,确保它符合预期。

五、总结

在软件开发中,保持本地 Git 仓库的整洁至关重要,它不仅有助于提升代码质量,也方便团队协作。通过有效的整理操作,我们可以清晰地管理提交历史,避免历史数据的混乱。本文将深入探讨本地仓库整理的必要性,以及如何利用诸如交互式变基等工具,优化提交流程。无论是修改最近的提交,还是合并多个提交,合理的整理策略都能提升生产力,并减少潜在的冲突。让我们一起掌握这些实用技巧,确保你的版本控制流程更高效、更有条理。

在这里插入图片描述

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

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

相关文章

安装ubuntu server24.04系统

0.写在前面 Legacy和UEFI比较legacyUEFI定义基于BIOS的传统引导模式新一代的系统引导模式兼容性较好,支持多数系统主要支持64位系统,对旧版本系统支持较差磁盘分区MBR,最大2.2TB,最多4个主分区GPT,最大16TB,理论上无分…

临床试验设计的干预、受试者和结果指标

临床试验是医学研究中至关重要的一环。通过科学设计和严格实施的临床试验,我们能够系统地评估新药、新疗法以及其他医学干预措施的安全性和有效性。临床试验的设计需考虑多个因素,其中干预、受试者和结局是三大关键要素。本文将详细探讨这些要素在临床试…

基于Jeecgboot3.6.3的vue3版本的流程中仿钉钉流程的鼠标拖动功能支持

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、因为原先仿钉钉流程里不能进行鼠标拖动来查看流程,所以根据作者提供的信息进行修改,在hooks下增加下面文件useDraggableScroll.ts import { ref, onMounted, on…

【Python】操作数据库

一、数据库编程接口 为了对数据库进行统一的操作,大多数语言都提供了标准化的数据库接口(API)。数据库提供了接口,Python定义了规范(包括数据操作的对象、函数等),通过Python定义的对象就能直接…

对称加密 和 非对称加密

对称加密 和 非对称加密 文章目录 对称加密 和 非对称加密对称解密——异或运算非对称解密——RSA算法问题RSA算法社会地位缺点 PS:RSA算法的攻击方式 如果对你有帮助,就点赞收藏把!(。・ω・。)&am…

支持10K长视频理解的多模态大模型MovieChat(CVPR 2024)

MovieChat: From Dense Token to Sparse Memory for Long Video Understanding 论文信息 paper:CVPR 2024 code:https://rese1f.github.io/MovieChat/ 视觉模型大语言模型:首个支持10K帧长视频理解任务的新型框架(推荐这篇公众号…

小程序开发全攻略:从零到上线的实战历程

引言 在当今的数字化时代,小程序凭借其轻便、快捷的特点,成为了连接用户与服务的桥梁。作为一名开发者,你可能正考虑踏入小程序开发的领域,但面对纷繁复杂的开发流程和技术要点,或许会感到无从下手。今天,我…

C 语言文件操作详解

目录 引言 一、基本概念 1.什么是文件 2.文件的属性 3.为什么使用文件 4.二进制文件和文本文件 二、文件的打开和关闭 1.流和标准流 2.文件指针 3.文件的打开和关闭 三、⽂件的顺序读写 1.顺序读写函数 2.详细介绍 1.fgetc 2.fputc 3.fgets 4.fputs 5.fscan…

统计:多变量时间序列分析 — VMA、VAR、VARMA

统计:多变量时间序列分析 — VMA、VAR、VARMA 一、说明 多变量时间序列是一个在大学课堂上经常被忽视的话题。然而,真实世界的数据通常具有多个维度,我们需要多变量时间序列分析技术。在这篇博客中,我们将通过可视化和 Python 实现…

【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾

系列篇章💥 No.文章1【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾2【GLM-4开发实战】Function Call进阶实战:常见挑战之意图识别处理3【GLM-4开发实战】Function Call进阶实战:常见挑战之海量函数处理4【GLM-4开发实…

【STM32】GPIO和AFIO标准库使用框架

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 GPIO简介 GPIO时钟使能 GPIO初始化 工作模式 选择引脚 输出速度 函数应用 GPIO初始化框架 8个电平读写函数 写端口电平 读端口电平 GPIO框架汇总 AFIO简介 AFIO时钟使能 函数应…

【Material-UI】深入理解useAutocomplete Hook:自定义与高级用法

文章目录 一、什么是useAutocomplete?导入useAutocomplete 二、基本用法代码解析 三、高级定制1. 自定义选项渲染2. 分组和排序3. 自定义输入框行为4. 与其他组件集成 四、注意事项1. 类型安全2. 性能优化 五、总结 Material-UI提供了强大的Autocomplete组件&#x…

Stable Diffusion绘画 | 图生图-基础使用介绍—重绘幅度与缩放模式

重绘幅度 重绘幅度越大,出图与原图差异越大。 重绘幅度0.7 重绘幅度0.3 缩放模式 目前有以下四种缩放模式: 原图的宽高是1080x1440,当修改宽高,与原图不一致时,可选择其中一种缩放模式来处理图片。 仅调整大小 缩放…

C++入门基础(上篇)

C入门基础(上篇) hello everybody!经历了C语言和初阶数据结构的头脑风暴,相信大家对于编程的学习更加开心,所以说接下来我们将迎来C的学习与探索,话不多说让我们开始吧 namespace的价值 在C/C中,变量、函…

计算机毕业设计选题推荐-自习室座位预约系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

GD32 MCU硬件I2C不可靠不如软件I2C?

在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。 那么为什么会出现I2C BUSY?硬件I2C真的不如软件I2C吗?怎么让硬件I2C也稳得一批,让我们来一探究竟。 首先我们从I2C时序分析下I2C总…

基于pytorch的steam游戏评分的线性回归问题分析

前言 相信已经暑假一个月的大家肯定并不陌生上面这个学习软件(),面对琳琅满目的游戏总是让人不知道挑选什么,这时候一个游戏的评分往往便成为了一个玩家选择下载的原因,那么今天我们就来研究研究,steam上一个游戏的种种数据&…

Celery注册装饰器@app.task和@shared_task

注册装饰器 app.task和shared_task是Celery中用于定义任务的两种不同装饰器, 它们之间存在明显的区别.from celery import Celery app Celery(my_app, brokeramqp://guestlocalhost//) app.task def my_task(): # 任务逻辑 passfrom celery import shared_task shared…

数据结构——双链表详解(超详细)

前言: 小编在之前已经写过单链表的创建了,接下来要开始双链表的讲解了,双链表比单链表要复杂一些,不过确实要比单链表更好进行实现!下面紧跟小编的步伐,开启今天的双链表之旅! 目录 1.概念和结构…