当前位置: 首页 > news >正文

【Git】万字详解 Git 的原理与使用(上)

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 初识 Git
    • 1.1 Git 是什么?
    • 1.2 为什么要有 Git
  • 2. 安装 Git
    • 2.1 Linux-Ubuntu 安装 Git
    • 2.2 Windows 安装 Git
  • 3. Git 初始化与配置
    • 3.1 创建 Git 本地仓库
    • 3.2 配置 Git
    • 3.3 查看配置
    • 3.4 删除配置
  • 4. Git 工作流程 - 认识工作区、暂存区、版本库
  • 5. Git 基本操作
    • 5.1 添加文件
      • 5.1.1 场景一
      • 5.1.2 场景二
    • 5.2 查看.git文件
      • 【可能遇到的问题】 Windows下的 Git Bash 环境下并没有安装 tree工具
    • 5.3 修改文件
    • 5.4 版本回退
    • 5.5 撤销修改
      • 5.5.1 情况一:对于工作区代码还未 add
      • 5.5.2 情况二:已经 add,但没有 commit
      • 5.5.3 情况三:已经 add,并且 commit 了
    • 5.6 删除本地仓库中的文件

1. 初识 Git

1.1 Git 是什么?

Git 是一个开源的分布式版本控制系统,用于高效地跟踪和管理项目代码的变更历史(不仅仅是代码,还有其它格式也是可以的~)

1.2 为什么要有 Git

在学习或者是工作的时候,比如编写各种文档,为了防止文档丢失,更改失误,我们不得不复制出一个副本,保留历史记录,方便找回历史记录,比如:

“设计文档-v1”
“设计文档-v2”
“设计文档-v3”
“设计文档-确定版”
“设计文档-最终版”

每个版本有各自的内容,但最终会只有⼀份文档是需要被使用的,在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,文件就越来越多,不仅文件多,更重要的是,随着版本数量的不断增多,我们可能记不太清每一个版本具体修改的哪些内容,文档如此,我们编写的项目代码也如此!

在这里插入图片描述

那么,如何解决呢?

答:版本控制器 ,记录每次修改以及版本迭代的一个管理系统,目前,最主流的版本控制器就是 Git,可以控制电脑上所有格式的文件

为了能够更方便管理这些不同版本的⽂件,便有了版本控制器! 所谓的版本控制器,就是能让你了解到⼀个文件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也方便多人协同作业,目前最主流的版本控制器就是 Git,Git 可以控制电脑上所有格式的文件,例如doc、excel、dwg、dgn、rvt等等,对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项目中的源代码文件!

注意事项
所有的版本控制系统,Git也不例外,其实只能跟踪文本文件的改动,比如 txt文件,网页,所有的程序代码等等,版本控制系统可以告诉你每次的改动,比如在第10行加了"name",在第12行删除了一个"Windows",而图片、视频等这些二进制文件,虽然也能由版本控制系统管理,但没办法跟踪文件的变化,只能把⼆进制文件每次改动串起来,即只知道图片从90KB改成了100KB,但到底改了啥,版本控制系统无法记录,所有并不知道,也没法知道~

在这里插入图片描述

2. 安装 Git

接下来,我们来进行实操!安装 Git ~

Git 是开放源代码的代码托管工具,最早是在 Linux 下开发的,当然,最开始也只能应用于 Linux 平台,后面慢慢的被移植到 Windows下,现在 Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常运行了~

2.1 Linux-Ubuntu 安装 Git

这里介绍 Ubuntu 下的安装(因为 Centos 现在不维护了~,因此,本文不作过多介绍)

在 Ubuntu 安装 git 相当简单~ 一起来看看!

  1. 首先查看系统有没有安装过 Git,输入命令:git --version
  • 如果出现 git 版本号已经安装:
    在这里插入图片描述
  • 如果出现这类提示,则没安装
Command 'git' not found, but can be installed with:
sudo apt install git
  1. 没有则进行安装,输入安装命令:sudo apt-get install git -y(在安装过程中,出现了图形化界面,回车即可~)
    再次输入 git --version,就可以看到 git 版本号啦!此时,安装完成!(是不是非常简单!)

2.2 Windows 安装 Git

Git 官网直接下载:Git 下载官网

  1. 选择 Windows 操作系统

在这里插入图片描述

  1. 根据自己的电脑选择相应的下载

在这里插入图片描述

  1. 下载完成后,找到下载到的文件,进行双击进行安装
    在这里插入图片描述

  2. 接着,按照指示,一步步安装~

非常简单的~ 按照指示点下一步就好啦(勇敢牛牛,不怕困难!)

  1. 检测是否安装好 Git,打开 Git Bash

在这里插入图片描述

输入:git -- verison,出现对应安装的 git 版本号,就是安装成功啦!!!
在这里插入图片描述

3. Git 初始化与配置

Git 的安装是很简单的,现在我们来看看 Git 的初始化与配置~

3.1 创建 Git 本地仓库

可以将仓库理解成是进行版本控制的一个文件目录,如果我们想要对文件进行版本控制,就必须先创建一个仓库出来!

创建⼀个 Git 本地仓库对应的命令为 git init ,注意命令要在文件目录下执行,例如:

  1. 首先找到自己想要的文件目录~

在这里插入图片描述

  1. 右键,找到选项【Git Bash Here】 ,进入界面,输入仓库初始化命令

在这里插入图片描述

我们就会发现,当前目录下多了一个.git 的隐藏文件,.git 目录是 Git 用来跟踪管理仓库的,千万不要手动修改里面的文件!!! 如果修改了,很容易乱,就会把 Git 仓库给破坏了~(感兴趣的小伙伴,可以点击进行详细了解哦)

3.2 配置 Git

当安装 Git 后首先要做的事情就是设置你的用户名称和 e-mail 地址,这是非常非常重要的,配置命令为:

git config [--global] user.name "Your Name" 
git config [--global] user.email "email@example.com" # 把 Your Name 改成你的用户名
# 把 email@example.com 改成你的邮箱的格式,只要格式正确即可

示例:

git config [--global] user.name "xxx" 
git config [--global] user.email "1234567@163.com" 

注意 --global 是⼀个可选项,如果使用了该选项,就表示这台机器上所有的 Git 仓库都会使用这个配置,如果你希望在不同仓库中使用不同的 name 或 e-mail ,即可以不要 --global 选项,但需要注意的是,执行命令时必须要在仓库里面~

3.3 查看配置

查看配置命令:git config -l

在这里插入图片描述

3.4 删除配置

删除对应的配置命令如下:

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

4. Git 工作流程 - 认识工作区、暂存区、版本库

  • 工作区:是在电脑上要写的代码或者是文件的目录

  • 暂存区(stage/index):一般存放在 .git 目录下的 index 文件(.git/index)中,把暂存区有时也叫作索引(index)

  • 版本库(repository):也叫仓库,工作区有⼀个隐藏目录 .git ,它不算工作区,而是 Git 的版本库,这个版本库里面的所有文件都可以被 Git管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"

在这里插入图片描述

  • 左侧为工作区,右侧为版本库,Git 的版本库里存放了很多东西,其中最重要的是暂存区
  • 在创建版本库的时候, Git 会自动为我们自动创建一个唯一的 master 的分支,以及指向 master 的一个指针 HEAD (分支与HAED后续介绍)
  • 当对工作区修改或者是新增的文件,执行 git add 命令,暂存区目录树的文件索引会被更新
  • 当执行提交操作 git commit 时,master 分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中

Git 工作流程:

  1. 工作区:开发者实际编辑代码的目录
  2. 暂存区:通过 git add 将修改添加到暂存区,准备提交
  3. 本地仓库(Local Repository):通过 git commit 将暂存区的修改保存到本地仓库,生成一个提交记录(上述介绍的是本地仓库)
  4. 远程仓库(Remote Repository):通过 git push 将本地提交推送到远程仓库,如Gitee、GitHub(后续介绍如何连远程仓库)

5. Git 基本操作

(碎碎念:笔者每次都喜欢先看到命令集合,有啥先用啥,之后再慢慢了解原理,因此,这里先介绍几个常用的命令,方便查找~同时,笔者后续内容均基于 Windows 11 系统展示操作)

命令作用
git init初始化一个Git仓库
git clone 克隆远程仓库到本地
git status查看当前仓库状态
git log查看历史提交记录
git reflog记录本地的每⼀次命令
git add 添加文件到暂存区
git commit -m “msg”提交修改到本地仓库
git push origin main推送到远程仓库的main分支
git pull origin main从远程仓库拉取最新代码
git branch查看分支
git checkout 切换分支
git merge 合并分支
git reset版本回退

5.1 添加文件

5.1.1 场景一

在包含.git 的目录下新建⼀个 Read 文件,

  1. 可以使用 git add 命令可以将文件添加到暂存区:
  • 添加⼀个或多个文件到暂存区: git add [file1] [file2] ...

  • 添加指定目录到暂存区,包括子目录: git add [dir]

  • 添加当前目录下的所有文件改动到暂存区: git add .

  1. 再使用 git commit 命令将暂存区内容添加到本地仓库中:
  • 提交暂存区全部内容到本地仓库中: git commit -m "message"

  • 提交暂存区的指定文件到仓库区: git commit [file1] [file2] ... -m "message"

注意 git commit 后⾯的 -m 选项,要跟上描述本次提交的 message,由用户自己完成,这部分内容千万不能省略,并且要好好描述,这是记录提交的细节,方便自己看也是方便别人看的~(不好好描述,自己和别人都不好理解哦!)

示例:

在这里插入图片描述
git commit 命令执行成功后会告诉我们,1个文件被改动,就是我们新添加的 Read 文件,插入了一行内容,Read 有一行内容

也可以多次 add 不同的⽂件,而只 commit ⼀次便可以提交所有文件,是因为需要提交的文件是通通被 add 到暂存区中,然后⼀次性再commit暂存区的所有修改,如下:

在这里插入图片描述
这样就一次性将暂存区的三个文件都提交了~

可以使用 git log 命令,来查看历史提交记录:可以看到刚刚提交的两次记录
在这里插入图片描述
git log 命令显示从最近到最远的提交⽇志,并且可以看到我们 commit 时的日志消息,如果觉得输出信息太多,可以加上 --pretty=oneline 参数,即 git log --pretty=oneline,日志更加简单,可以清楚了解~

5.1.2 场景二

为了更深刻理解工作区、暂存区、版本库,这里再展示一种场景,如下:

在这里插入图片描述
提交后发现打印了 1 file changed, 0 insertions(+), 0 deletions(-) ,只有⼀个文件改变了,但是,我们新增了两个文件呀!
仔细观察, git add 是将文件添加到暂存区, git commit 是将暂存区的内容添加到本地仓库中。在上述命令,并没有使用 git add file5 ,file5 就不在暂存区中维护,因此,commit 的时候其实只是把已经在暂存区的 file4 提交了,遗漏了工作区的 file5,那如何提交 file5 呢?很简单,再次 git add file5 , commit 即可~

所以,有时候你 commit 了,结果该内容并没有提交,需要排查一下是否将这个内容添加到了暂存区哦~

5.2 查看.git文件

首先,我们来看看 .git 的目录结构,进入 .git 文件(注意,是点击进入.git隐藏文件哦!),使用命令:tree,查看树形结构

如下:这是没有任何提交记录的哦~

在这里插入图片描述
在上一小节中,我们添加了文件,再添加文件后,我们再来观察 .git 文件的树形结构

在这里插入图片描述

总结】在本地的 git 仓库中,有几个文件或者目录很特殊:

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

小建议】:在后面的学习过程中,我们最好能将常见的 git 操作与 .git 目录当中的结构内容变化对应起来,这样有利于我们理解 git 细节流程

【可能遇到的问题】 Windows下的 Git Bash 环境下并没有安装 tree工具

问题:如果出现 bash: tree: command not found ,则说明在 Windows下的 Git Bash 环境下并没有安装 tree工具,因此,导致无法使用

在这里插入图片描述
解决方式:git bash 默认是没有 tree 命令的!下载 tree

  1. 下载

在这里插入图片描述

  1. 解压,在 bin 目录下找到 tree.exe

在这里插入图片描述
3. 将 tree.exe 拷贝到 git bash 的应用程序位置,找到自己的 git安装路径\usr\bin

在这里插入图片描述

  1. 再次输入 tree 命令,即可:

在这里插入图片描述

5.3 修改文件

Git 比其他版本控制系统设计得优秀,是因为 Git 跟踪并管理的是修改,而并非文件,就比如新增了一行内容,这就是⼀个修改,删除了一行内容,也是⼀个修改,更改了某些字符,也是⼀个修改,删了⼀些⼜加了⼀些,同样是⼀个修改!

现在对 Read 文件,进行修改,通过 git status,查看上次提交之后是否有对文件进行再次修改
(注意仓库中的 Read 和 工作区的 Read 是不同的,我们这里是在工作区进行修改的!通过 git status,查看当前仓库的状态)

在这里插入图片描述
图中结果显示,Read 已经被修改过,但是还没有完成添加与提交,目前,只知道文件被修改了,但是不知道具体哪些地方被修改了!(知道这个是很重要的!)

使用 git diff [file] 命令用来显示暂存区和工作区文件的差异,也可以使用 git diff HEAD -- [file] 命令来查看版本库和工作区文件的区别,知道了对 Read 做了什么修改后,再把它提交到本地仓库就会放心许多!

在这里插入图片描述
使用 add 添加到暂存区,再 commit 提交到本地仓库~

在这里插入图片描述

5.4 版本回退

我们知道,Git 能够管理文件的历史版本,这也是版本控制器最重要的能力,如果想在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能~ 执行回退版本命令: git reset
可以指定退回某⼀次提交的版本,注意,"回退"本质是要将版本库中的内容进行回退,⼯作区或暂存区是否回退由命令参数决定!

git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]

  • --mixed 为默认选项,使用时可以不带该参数,该参数是将暂存区的内容退回为指定提交版本内容,而工作区文件保持不变

  • --soft 该参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本

  • --hard 参数将暂存区和工作区都退回到指定版本,切记!!!工作区有未提交的代码时千万不要使用这个命令,因为工作区会回滚,没有提交的代码就再也找不回了,因此,使用这个参数的时候,一定要慎重

  • HEAD 可直接写成 commit id,表示指定退回的版本,也可以这样写:

写法1:使用 ^

HEAD 表示当前版本
HEAD^ 表示上⼀个版本
HEAD^^ 表示上上⼀个版本
以此类推…

写法2:可以使用 ~ 数字表示

HEAD~0 表示当前版本
HEAD~1 表示上⼀个版本
HEAD~2 表示上上⼀个版本
以此类推…

示例:为了方便演示回退功能,先做一些准备工作,更新 3 个版本的 Read,并进行 3 次提交,准备工作如下:

在这里插入图片描述
操作一】提交 version3 后,发现 version3 编写有误,想回退到 version2,重新基于 version2 开始写,这里希望工作区的内容也回退到 version2 版本,因此需要 --hard 参数,如下:

在这里插入图片描述
可以看到 Read 文件的内容,已经回退到 version2 了,使用 git log 查看提交⽇志,也发现 HEAD 指向了 version2

操作二】后悔回退到 version2,想再回到 version3

可以继续使用 git reset 命令,回退到 version3 版本,but 我们必须要拿到 version3 的 commit id 去指定回退的版本,从上图中,看到 git log 并不能打印出 version3 的 commit id ,如果运气好的话,可以在终端找之前的记录,运气不好的话,commit id 已经被我们搞丢啦,不过不用担心!Git 还提供了⼀个 git reflog 命令,可以补救⼀下,该命令用来记录本地的每⼀次命令!!!

在这里插入图片描述
使用git reflog 可以很方便找到所有操作记录,但 e9980d9 是什么呢?是 version3 的 commit id 的部分,Git 版本回退的时候,也可以使用部分 commit id 来代表目标版~

操作三】在实际开发中,由于长时间开发,导致 commit id 早就找不到了,但是又想回到 version3,貌似现在不可能~

我们要知道 Git 版本回退速度非常快,因为 Git 在内部有个指向当前分支,这里是 HEAD 指针默认指向 master 分支,在.git 隐藏文件中refs/heads/master 文件里面保存了当前 master 分支的最新 commit id,当我们在回退版本的时候, Git 仅仅是给 refs/heads/master 中存储⼀个特定的 version,可以简单理解为下图:

在这里插入图片描述

可以查看 refs/heads/master 文件内容,保存了最新的 commit id,如下:

如果是操作二,回退到 version3 版本,则保存的 commit id 为 version3 的:

在这里插入图片描述
如果是操作一,回退到 version2 版本,则保存的 commit id 为 version2 的:

在这里插入图片描述

5.5 撤销修改

有一种场景,比如在工作区写了很久的代码,但是越写越写不下去,觉得自己写得不太好,想恢复到上⼀个版本~ 我们需要撤销修改,这里分三种情况:

5.5.1 情况一:对于工作区代码还未 add

操作一】可以直接删除目前在工作区中新增的代码(不推荐),如下:

在这里插入图片描述
万幸!才写了一行内容,就发现需要删除了,万一写了很多,一直都没有提交,可能都忘记自己新增的哪些内容了,那如何删除呢?

Git 为我们提供了更好的方式!!!

操作二】使用 git checkout -- [file] 命令,使工作区文件回到最近一次 add 或者是 commit 状态(注意,该命令中的 -- 千万不能省略,省略就变成其它意思了!!!)

在这里插入图片描述

5.5.2 情况二:已经 add,但没有 commit

add 了,保存到了暂存区,如何撤销呢?

还记得刚介绍的 git reset 回退命令嘛!! 该命令使用 --mixed 参数,则可以将暂存区的内容回退到指定版本的内容,工作区文件保持不变,这样,我们就可以回退暂存区的内容了~

命令:git reset HEAD Read (注意,这里为啥没有带上 --mixed 参数呢?因为 --mixed 参数是默认的!!!)

在这里插入图片描述

5.5.3 情况三:已经 add,并且 commit 了

这种情况也无需担心,使用 git reset --hard HEAD^ 回退到上一个版本

不过这里是有条件的,即还没有将自己本地版本库推送到远程!!!(一旦推送到远程版本库,那就…)

在这里插入图片描述

5.6 删除本地仓库中的文件

在 Git 中,删除也是一个修改操作

下面演示删除 file4 文件:

使用 rm file4

在这里插入图片描述

这样直接删除是没有用的,此时只是删除了工作区的 file4,git status 会告诉你哪些文件被删除了,但是,这个时候,工作区和版本库就不一致了,要删除文件,除了要删除工作区的文件,还要清除版本库的文件

到这里,有两种情况:

情况一确实需要从版本库删除该文件

使用 git rm [文件名],将文件从工作区和暂存区中删除,并且 commit ~

在这里插入图片描述

情况二删错了

使用 git checkout -- file4 来恢复, 删除也是修改哦,这是刚刚学过的命令~

在这里插入图片描述

这期 git 内容介绍到这里,可以自己动手操作,加深印象哦~

💛💛💛本期内容回顾💛💛💛

在这里插入图片描述
✨✨✨本期内容到此结束啦~

相关文章:

  • 第 13 届蓝桥杯 C++ 青少组省赛中 / 高级组 2022 年真题
  • 【东枫电子】AMD / Xilinx Alveo™ UL3422 加速器
  • 【愚公系列】《Manus极简入门》012-自我认知顾问:“内在探索向导”
  • Golang 身份证号码校验
  • 【优选算法 | 位运算】位运算基础:深入理解二进制操作
  • ASP.NET MVC​ 入门与提高指南七
  • < 自用文 Texas style Smoker > 美式德克萨斯烟熏炉 从设计到实现 (第一部分:烹饪室与燃烧室)
  • 基于Redis实现-UV统计
  • openEuler 22.03 安装 Mysql 5.7,RPM 在线安装
  • 解决 3D Gaussian Splatting 中 SIBR 可视化组件报错 uv_mesh.vert 缺失问题【2025最新版!】
  • 组件通信-v-model
  • [Control-Chaos] Toxic Cascade(毒性級鏈)
  • 青少年编程与数学 02-018 C++数据结构与算法 22课题、并行算法
  • linux的信号量初识
  • 【Vue】Vue与UI框架(Element Plus、Ant Design Vue、Vant)
  • 第一章:A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • C++之IO流
  • 计算方法实验四 解线性方程组的间接方法
  • 【Unity】使用XLua实现C#访问Lua文件
  • JavaScript常规解密技术解析指南
  • 5名中国公民在美国交通事故中遇难
  • 跳水世界杯总决赛:程子龙/朱子锋夺男子双人10米台冠军
  • 魔都眼|石库门里看车展,五一来张园体验城市“漫时光”
  • 刘洪洁已任六安市委副书记、市政府党组书记
  • 净海护渔,中国海警局直属第一局开展伏季休渔普法宣传活动
  • 韩国检方结束对尹锡悦私宅的扣押搜查