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

Windows系统下读写Mac OS磁盘驱动的完整解决方案

本文还有配套的精品资源,点击获取 简介:由于文件系统不兼容,Windows无法直接读写采用HFS+或APFS格式的Mac OS磁盘。本文详细介绍在Windows环境下实现对Mac磁盘读写的技术方案,涵盖主流工具如Paragon HFS+、Tuxera NTFS、Mounty等,并探讨通过虚拟机和第三方文件管理器实现跨平台数据访问的方法。文章旨在为需要在双平台间交换数据的用户提供安全、高效的实践指导,确保数据完整性与操作便捷性。 Mac与Windows跨平台磁盘访问技术全解析 你有没有遇到过这样的尴尬?朋友递来一块外置硬盘,说是“里面都是照片”,可你插上电脑后系统却弹出:“需要格式化才能使用”——救命,这可是人家的结婚照啊!🤯 或者你在公司里接手一个项目,前任同事用的是Mac,留下的资料盘在你的Windows主机上直接“失踪”。这些日常场景背后,其实隐藏着现代计算世界最基础、也最容易被忽视的技术鸿沟: 文件系统的不兼容性 。 别小看这个“读不了盘”的问题。它不仅仅是两个操作系统之间的摩擦,更是底层设计哲学的碰撞。Mac和Windows各自构建了一套完整而封闭的数据管理体系,它

By Ne0inhk
KaiwuDB社区版 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置、踩坑复盘与轻量压测

KaiwuDB社区版 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置、踩坑复盘与轻量压测

KWDB 作为一款易用性不断优化的数据库产品,其 3.1.0 版本在运维脚本、配置管理等方面的升级为部署带来了便利,但新手在单机部署过程中仍易因环境适配、依赖缺失、配置不当等问题踩坑。为帮助开发者快速落地 KWDB 单机环境,本文以 Ubuntu 22.04 为基础环境,从实战角度出发,完整拆解 KWDB 3.1.0 单机部署的全流程:不仅明确版本选型依据和部署目标,还细化了环境核查、安装包获取、依赖配置、部署脚本执行等关键操作,针对性解决部署中的高频问题,并通过服务验证、性能基线测试完成最小化验收,最终实现 “安装即能用、问题有解法、效果可验证” 的部署目标,为 KWDB 入门者提供清晰、可复现的实操指引。 文章目录 * 1. 版本与部署路线怎么选 * 2. 目标:这篇文章读完,能带走哪些“

By Ne0inhk
Linux 动态链接与动态库加载深度解析

Linux 动态链接与动态库加载深度解析

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 进程如何感知并加载动态库 * 1.1 进程对动态库的 “可见性” * 1.2 多进程共享动态库的实现 * 二. 动态链接的核心工作原理 * 2.1 程序运行前的动态链接准备 * 2.2 动态库的地址无关性:PIC 编译 * 2.3 运行时的地址重定位:从符号到实际地址 * 三. GOT/PLT:动态链接的核心实现机制 * 3.1 全局偏移量表(GOT) * 3.2 过程链接表(PLT):延迟绑定优化 * 3.

By Ne0inhk