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

Snipe-IT开源IT资产管理系统终极指南:从部署到精通

Snipe-IT开源IT资产管理系统终极指南:从部署到精通 【免费下载链接】snipe-itA free open source IT asset/license management system 项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it 在数字化浪潮中,企业IT资产管理面临着设备分散、信息不透明、维护困难等挑战。Snipe-IT作为一款基于Laravel框架开发的开源IT资产与许可证管理系统,为各类组织提供了全生命周期的资产追踪解决方案。本指南将带你深度掌握Snipe-IT的核心功能与最佳实践,助你轻松实现资产管理的数字化转型。🚀 🎯 系统概览与核心价值 Snipe-IT不仅仅是简单的资产登记工具,它通过模块化设计实现了硬件设备、软件许可证、配件耗材的统一管理。系统采用现代化的技术架构,支持Docker容器化部署,具备高可用性和可扩展性。 图:Snipe-IT支持的典型设备类型 - MacBook Pro笔记本电脑 为什么选择Snipe-IT? * 完全开源免费:基于MIT许可证,无任何隐藏费

By Ne0inhk

代码合并冲突解决:Git 合并冲突的代码处理技巧

Git 合并冲突的常见场景 当多个分支修改同一文件的相同区域时,Git 无法自动合并,会标记为冲突状态。冲突文件会包含特殊标记(<<<<<<<、=======、>>>>>>>),需手动解决。 识别冲突文件 运行 git status 查看冲突文件列表。冲突文件会显示为 both modified 状态。 冲突标记示例: <<<<<<< HEAD 当前分支的代码 ======= 要合并的分支的代码 >>>>>>> branch-name

By Ne0inhk
GitNexus 核心引擎深度解析

GitNexus 核心引擎深度解析

GitNexus 核心引擎深度解析 索引流水线、社区检测与流程追踪、混合搜索与嵌入生成 一、入口类与架构关系 GitNexus 的核心引擎由三个相互协作的子系统构成:索引流水线(Ingestion Pipeline)、社区与流程检测(Community & Process Detection)、混合搜索与嵌入(Hybrid Search & Embeddings)。这三个子系统共同将原始代码库转换为可查询的知识图谱。 1.1 核心类关系图 1.2 关键数据结构 KnowledgeGraph:知识图谱的核心数据结构,包含节点(Node)和关系(Relationship)集合。节点类型包括 File、Folder、Function、Class、Method、Interface、Community、Process;关系类型包括 CALLS、IMPORTS、EXTENDS、IMPLEMENTS、

By Ne0inhk

GitHub开源免费PDF编辑器推荐:告别破解,高效编辑PDF

文章目录 * 1. PDF补丁丁:国产良心工具箱 * 简介 * 主要功能 * 开源地址 * 特点 * 2. Stirling-PDF:功能全面的PDF处理工具 * 简介 * 主要功能 * 安装与部署 * Docker Compose示例 * OCR中文模型安装 * 开源地址 * 特点 * 3. pdf-lib:强大的JavaScriptPDF库 * 简介 * 主要功能 * 安装 * 代码示例 * 开源地址 * 特点 * 4. gofpdf:Go语言的PDF库 * 简介 * 主要功能 * 安装 * 代码示例 * 开源地址 * 特点 * 总结与选择建议 还在为寻找免费的PDF编辑工具而烦恼吗?或许你曾使用过某些需要付费或破解的软件,不仅存在安全风险,还可能功能受限。本文将介绍几款GitHub上优秀的开源免费PDF编辑器,让你无需破解也能轻松处理PDF文档。 1. PDF补丁丁:国产良心工具箱 简介 PDF补丁丁是一款由国内开

By Ne0inhk