Git原理与使用(一)

Git原理与使用(一)

文章目录


当我们在学习或工作中可能会使用到同一种文档的不同版本,我们该如何快速准确的获得各种版本呢

什么是Git

Git:版本控制器

为了能够更方便的管理不同版本的文件,便有了版本控制器。所谓的版本控制器,就是一个可以记录工程的每一次改动和版本迭代的⼀个管理系统,同时也方便多人协同作业。目前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的文件,例如 doc、excel、dwg、dgn、rvt等等。对于开发人员来说,Git 最重要的就是可以帮助管理软件开发项目中的源代码文件!
注意: 所有的版本控制器,只能追踪文本文件的改动,比如.txt文件、各种程序代码等,每次改动时都可以知道具体的改动,比如某.txt文件第三行新增linux单词,第五行删除ZEEKLOG单词。但像二进制文件,比如图片、视频等,虽然也能由版本控制器管理,但无法直接追踪文件的具体变化,只能知道图片大小从100kb改成了150kb这样。

Git安装

Git可以在Linux、Unix、Mac和Windows这等平台运行。
以Linux-Ubuntu为例:
安装命令:

sudoapt-getinstallgit -y ... 

查看Git版本

git --version 

Git基本操作

初始化本地仓库

仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。执行所有的Git命令时都必须在对应的仓库中。
使用命令:

git init 

样例:

ubuntu@VM-0-6-ubuntu:~/githome$ pwd /home/ubuntu/githome ubuntu@VM-0-6-ubuntu:~/githome$ git init Initialized empty Git repository in /home/ubuntu/githome/.git/ 

初始化之后在当前目录下就出现了.git的隐藏目录,.git目录是Git用来追踪管理仓库的,千万不要手动修改这个目录中的任何文件!

ubuntu@VM-0-6-ubuntu:~/githome$ ll total 12 drwxrwxr-x 3 ubuntu ubuntu 4096 Feb 219:35 ./ drwxr-x--- 8 ubuntu ubuntu 4096 Feb 219:33 ../ drwxrwxr-x 7 ubuntu ubuntu 4096 Feb 219:35 .git/ 

.git目录结构:

在这里插入图片描述

配置Git

当安装Git之后需要配置用户名称email地址
使用命令:

git config [--global] user.name "your name"git config [--global] user.email "your email"
在这里插入图片描述

其中 --global 是一个可选项,如果使用了这个选项,那么本台主机的所有Git仓库都会使用这个配置。
查看配置命令:

git config -l 
在这里插入图片描述

删除对应的命令:

git config [--global] --unset user.name git config [--global] --unset user.email 

工作区、暂存区、版本库

各自含义

  • 工作区(Working Directory):是在电脑上你要写代码或文件的目录,如 ReadMe 文件所在的目录
  • 暂存区(Staging Area):英文叫 stage 或 index。⼀般存放在 .git 目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index)。
  • 版本库(Git Repository):又名仓库,工作区有⼀个隐藏目录 .git ,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

这三者之间的关系:

在这里插入图片描述
  • Git 的版本库里存了很多东西,其中最重要的就是暂存区。在创建 Git 版本库时,Git 会为我们自动创建⼀个唯⼀的 master 分支,以及指向 master 的⼀个指针叫 HEAD
  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区目录树的文件索引会被更新。
  • 当执行提交操作 git commit 时,master 分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。

通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用git add 和 git commit 命令才能将文件添加到仓库中进行管理!!!

实际上暂存区以及版本库中保存的并不是真实的所有资源,如下图:

在这里插入图片描述
  • 对象库(objects):里面存放的是 git 对象,修改的工作区的内容会写入到对象库中的新的 git 对象并保存起来。master分支中保存的内容也是指向 git 对象的指针

添加文件

在包含 .git 的目录下新建⼀个 ReadMe 文件,我们可以使用 git add 命令可以将文件添加到暂存区:

  • 添加一个或多个文件到暂存区:
gitadd[file1][file2]... 
  • 添加指定目录下的所有文件包括子目录到暂存区:
gitadd[dirname]
  • 添加当前目录下的所有文件到暂存区:
gitadd.

然后使用git commit 命令将添加到暂存区的内容提交到版本库中

  • 提交暂存区全部内容到本地仓库中:
git commit -m "description of the content"
  • 提交暂存区的指定⽂件到仓库区:
git commit [file1][file2]... -m "description of the content"

git commit 中的 - m 选项是用来描述本次提交的内容、记录本次提交的细节的,这部分描述不能省略。

在这里插入图片描述


git commit 命令执行成功后会告诉我们,1个文件被改动(就是我们新添加的 ReadMe 文件),插入了两行内容(ReadMe有两行内容)。
我们也可以多次 add 不同的文件,而只 commit 一次便可以提交所有文件,是因为需要提交的文件是都是被 add 到暂存区中,然后⼀次性 commit 暂存区的所有修改:

在这里插入图片描述


我们可以使用 git log 命令来查看历史提交记录:

在这里插入图片描述


该命令显示从最近到最远的提交的日志,并且可以看到我们 commit 时的日志消息,也可以简化输出信息:
加上 --pretty=oneline 参数:

在这里插入图片描述

其中,一长串的字符比如:6054f…903966 是每次提交的 commit id (版本号),Git 的 版本号不是有规律的递增的数字,而是一个经过哈希计算出来的非常大的十六进制数字。

查看 .git 目录

在这里插入图片描述
  1. index 就是我们的暂存区,add 后的内容都是添加到这里的
  • HEAD 就是我们的默认指向 master 分支的指针
ubuntu@VM-0-6-ubuntu:~/githome$ cat .git/HEAD ref: refs/heads/master 
  1. 默认的 master 分支:
ubuntu@VM-0-6-ubuntu:~/githome$ cat .git/refs/heads/master 6054f80bb692c443efc30c26f8fcd9a27e903966 

其中,这一长串字符,就是当前最新的 commit id 。

objects 为 Git 的对象库,里面包含了创建的各种版本库对象及内容。当执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于 “.git/objects” 目录下。

在这里插入图片描述

查找 object 时要将 commit id 分成2部分,其前2位是文件夹名称,后38位是文件名称。找到这个文件之后,⼀般不能直接看到里面是什么,该类文件是经过 sha (安全哈希算法)加密过的文件,

在这里插入图片描述

我们可以使用 git cat-file 命令来查看版本库对象的内容

# 第一步:先看看这是什么类型的对象git cat-file -t 6054f80bb692c443efc30c26f8fcd9a27e903966 # 如果返回 "blob",表示这是一个文件# 如果返回 "tree",表示这是一个目录# 如果返回 "commit",表示这是一个提交# 第二步:根据类型查看内容# 如果是 commit:git cat-file -p 6054f80bb692c443efc30c26f8fcd9a27e903966 # 输出类似:# tree 7a9e0b... # 这个tree对象指向的文件结构# parent abc123... # 父提交# author ...# committer ...# 提交信息# 如果是 tree:git cat-file -p 6054f80bb692c443efc30c26f8fcd9a27e903966 # 输出类似:# 100644 blob abc123... README.md# 040000 tree def456... src# 如果是 blob:git cat-file -p 6054f80bb692c443efc30c26f8fcd9a27e903966 # 输出文件的实际内容

-t 选项:显示对象的类型,会返回对象的类型:blob、tree、commit 或 tag

在这里插入图片描述

-s 选项:显示对象的大小,会返回对象的大小(字节)
-p选项:以美观的格式显示对象的内容,-p 表示 “pretty-print”(美观打印),会显示对象的实际内容

在这里插入图片描述

包括一行 tree 906…c73,我们查看一下:

在这里插入图片描述


再查看对应的 ReadMe 05f…c43b :

在这里插入图片描述


这是我们对 ReadMe 做的修改,被 Git 记录了下来。

总结:在本地git仓库中

  • index: 暂存区, git add 后会更新该内容。
  • HEAD: 默认指向 master 分支的⼀个指针。
  • refs/heads/master: 文件里保存当前 master 分支的最新 commit id
  • objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改

Read more

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

FLASH坏块监测系统 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 开发一个 FLASH 坏块监测系统,能够监测 FLASH 中坏块的数量。FLASH 介质以一个大小为 m×n的二维二进制矩阵表示,其中:0 表示正常,1 表示异常。最初,FLASH 介质中的所有单元格都是正常(即,所有单元格都是 0)。 系统运行过程中,FLASH 坏块不断产生:随着系统持续运行,某一个时刻 i,FLASH 介质中的某个单元格 (ri,ci)由正常变为异常。返回一个整数数组 result,其中 result[i] 是 FLASH 介质中第

By Ne0inhk
Java 部署:Jenkins Pipeline 构建 Java 项目(自动化)

Java 部署:Jenkins Pipeline 构建 Java 项目(自动化)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java部署这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 部署:Jenkins Pipeline 构建 Java 项目(自动化) 🚀 * 为什么选择 Jenkins Pipeline?🔧 * 环境准备:搭建 Jenkins 服务器 ⚙️ * 使用 Docker 快速启动 Jenkins * 安装必要插件 * 示例 Java 项目:一个简单的 Spring Boot 应用 🌱 * 项目结构 * `pom.xml` * `DemoApplication.java` * `HelloController.java` * 单元测试(可选但推荐) * 编写 Jenkins

By Ne0inhk
OpenClaw Java — 用 Java 全栈实现一个 AI Agent Gateway

OpenClaw Java — 用 Java 全栈实现一个 AI Agent Gateway

项目简介 大家好,分享一下我最近在做的开源项目 OpenClaw Java —— 基于 Spring Boot 3.3 的 AI Agent Gateway 全栈实现,通过 WebSocket 自定义帧协议提供全功能 Agent 接口。 项目地址:https://github.com/yuenkang/openclaw-java 当前规模: 594 个 Java 源文件 + 17 个测试文件,约 88,500 行代码 为什么做这个项目? 目前 AI Agent 框架大多集中在 Python 和 TypeScript 生态,Java 社区相对缺少成熟的 Agent 运行时方案。

By Ne0inhk
【Java】2025 年 Java 学习路线:从入门到精通

【Java】2025 年 Java 学习路线:从入门到精通

文章目录 * 一、Java基础阶段(4-8周) * 1. 开发环境搭建 * 2. 核心语法基础 * 3. 面向对象编程(OOP) * 4. 核心类库 (Java SE API) * 5. 关联技术基础 * 二、Java 进阶阶段(6-10周) * 1. JVM 深度理解 * 2. 并发编程 - 应对高并发挑战 * 3. Java新特性 - 拥抱现代化 * 4. 设计模式 * 三、数据库与MySQL(2-3周) * 1. 环境搭建 * 2. SQL核心与进阶 * 3. 数据库设计与性能优化 * 四、开发框架与中间件(8-12周) * 1. Spring 生态

By Ne0inhk