1 . Git本地操作:版本控制 跨平台协作 仓库核心

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

目录

[一 .git初识](#一 .git初识)

二.Git安装

[2.1 Linux(centos/ubuntu)](#2.1 Linux(centos/ubuntu))

[2.2 Windows](#2.2 Windows)

三.Git本地仓库核心:初始化与概念

[3.1 创建本地仓库](#3.1 创建本地仓库)

[3.2 三大核心工作区:工作区 暂存区 版本库](#3.2 三大核心工作区:工作区 暂存区 版本库)

[工作区(Working Directory)------你的"代码实验室"](#工作区(Working Directory)——你的“代码实验室”)

[暂存区(Staging Area)------代码的"待机区"](#暂存区(Staging Area)——代码的“待机区”)

版本库(Repository)------代码的"时光机"

四.Git配置:设置用户身份

[五.git本地的核心操作:添加 提交和查看历史命令](#五.git本地的核心操作:添加 提交和查看历史命令)

[5.1 添加文件到仓库(工作区->暂存区->版本库)](#5.1 添加文件到仓库(工作区->暂存区->版本库))

场景二:批量添加多个文件

[5.2 查看历史提交命令](#5.2 查看历史提交命令)

[5.3 查看.git文件](#5.3 查看.git文件)

六.Git追踪管理的是修改


一 .git初识

在没有版本控制工具之前,我们管理文件版本的方式往往是"复制副本"--比如:

这种操作存在明显两个明显缺点

  • 版本混乱:随着版本的不断增多,无法清晰的知道每个版本修改的内容
  • 协作困难:多人协作不方便,同时修改一个文件容易造成一些问题

因此就有大佬发明了版本控制器,
为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
目前主流的版本控制器就是git,也是我们要学习的,

Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件**!**

注意事项: 所有的版本控制系统,Git 也不例外,只能跟踪⽂本⽂件的改动(TXT文件,网页,程序代码...),和每次代码改动的细节。

eg:⽐如在第5⾏加了⼀个单词 "Linux",在第8⾏删了⼀个单词 "Windows"。

⽽图⽚、视频这些⼆进制⽂件,虽然也能由版本控制系统管理,但没法跟踪⽂件的变化,只能把⼆进 制⽂件每次改动串起来,也就是只知道图⽚从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。


二.Git安装

支持跨平台操作
Git 是开放源代码的代码托管⼯具,最早是在Linux下开发的。开始也只能应⽤于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了。

2.1 Linux(centos/ubuntu)

centos

bash 复制代码
# 1. 检查是否已安装 Git(未安装会提示 "command not found")
[root@VM-4-4-centos ~]# git

# 2. 安装 Git,普通账户需要sudo,root不用
[root@VM-4-4-centos ~]# (sudo) yum -y install git

# 3. 验证安装(显示版本号即成功)
[root@VM-4-4-centos ~]# git --version

ubuntu 操作类似,只是安装变为了

bash 复制代码
sudo apt-get install git -y

2.2 Windows

参考链接:3.安装git和图形化界面工具_哔哩哔哩_bilibili


三.Git本地仓库核心:初始化与概念

3.1 创建本地仓库

仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建
⼀个仓库出来。
创建⼀个 Git 本地仓库对应的命令为 git init ,注意命令要在⽂件⽬录下执⾏,例如:

bash 复制代码
//1.创建目录
lcb@hcss-ecs-1cde:~$ mkdir gitcode
lcb@hcss-ecs-1cde:~$ cd gitcode
lcb@hcss-ecs-1cde:~/gitcode$ ls
//2.初始化仓库
lcb@hcss-ecs-1cde:~/gitcode$ git init
Initialized empty Git repository in /home/lcb/gitcode/.git/
//3.查看仓库
lcb@hcss-ecs-1cde:~/gitcode$ ls -a
.  ..  .git

我们发现,当前⽬录下多了⼀个 .git 的隐藏⽂件, .git ⽬录是 Git 来跟踪管理仓库的,不要**⼿动**
修改这个⽬录⾥⾯的⽂件,不然改乱了,就把 Git 仓库给破坏了。
其中包含 Git 仓库的诸多细节,有兴趣的同志可以进⼊看看

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-merge-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── push-to-checkout.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

3.2 三大核心工作区:工作区 暂存区 版本库

Git本地仓库的操作过程/文件的提交过程 ,工作区->暂存区->版本库

工作区(Working Directory)------你的"代码实验室"
  • 定义:肉眼可见的项目目录,所有文件修改的"第一现场"。

  • 特点

    • 直接编辑文件,修改实时生效。

    • 未添加到暂存区的改动,Git不会跟踪!

暂存区(Staging Area)------代码的"待机区"
  • 定义.git/index 文件,记录下一次提交的修改快照。

  • 核心作用

    • 选择性提交 :通过**git add** 挑选部分修改进入暂存区。

    • 版本缓冲:允许分批次准备代码,再统一提交。

版本库(Repository)------代码的"时光机"
    • 定义 :隐藏的 .git 目录,存储项目的完整历史记录。

    • 核心组成

      • 提交历史 :每次 git commit 生成一个不可变的快照。

      • 分支与标签:管理代码演进的指针。

图中左侧为工作区,右侧为版本库

  • git在创建仓库时,会自动创建一个且只有一个master分支,和一个指向master的HEAD指针
  • objects就是版本控制器,记录每一版本,其中暂且区和master都有索引,指向objects
  • 在对工作区修改/新增文件,再通过git add时,暂存区目录树的文件索引会新增修改
  • 当执行命令git commit,master分支做出更新,此时本地仓库修改/新增的才真正写入版本库

三者操作流程:在工作区修改文件->git add提交到暂存区 ->git commit再将暂存区的变化提交到版本库


四.Git配置:设置用户身份

git每次提交都会记录提交者的用户信息,因此初始化仓库需要配置好个人信息,优先配置姓名与邮箱

bash 复制代码
//配置姓名和邮箱
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config user.name "Milestone"
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config user.email "123456@qq.com"
//查看配置情况
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config -l
user.name=19174291684
user.email=3451978561@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=Milestone
user.email=123456@qq.com
//全局配置(当台电脑的所有git仓库都成立)
lcb@hcss-ecs-1cde:~/gitcode/.git$  git config --global user.name "XXX" 
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global user.email "XXX@qq.com"
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config -l
user.name=XXX
user.email=XXX@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=Milestone
user.email=123456@qq.com
//删除配置信息(global可带可不带)
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global --unset user.name
lcb@hcss-ecs-1cde:~/gitcode/.git$ git config --global --unset user.email
  • 建议姓名与邮箱与自己的gitee/GitHub一致,防止出现误解
  • global不带上,无论是配置还是删除,都只在当前目录的仓库下生效

五.git本地的核心操作:添加 提交和查看历史命令

5.1 添加文件到仓库(工作区->暂存区->版本库)

Git文件添加需要经过暂存区,且支持单个或者多个文件操作

场景一:新增一个文件并提交

  1. **新建一个ReadMe文件,**打开输入Hello Milestone
  2. 添加到暂存区 :通过git add ReadMe将文件添加到暂存区
  3. **提交到版本库:**使用git commit -m"",双引号内部填充你提交的目的,一定要 也可指定文件提交

提交成功后,Git 会提示 "1 file changed, 1 insertions (+)",表示 "1 个文件被修改,新增 1 行内容",符合预期。

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ vim ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git add ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git commit -m"add first file"
[master (root-commit) ef866eb] add first file
 1 file changed, 1 insertion(+)
 create mode 100644 ReadMe

场景二:批量添加多个文件

  1. 创建多个文件,touch file1 file2 file 3
  2. 提交到暂且区,既可git 文件名一个一个提交 也可git 文件名1 文件名2...,一次提交多个, 也可以git ,,提交当前目录的所有文件
  3. 提交到版本库,git commit -m"add 3 files" ,同时可以看到文件变化
bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ touch file1 file2 file3
lcb@hcss-ecs-1cde:~/gitcode$ git add file1 
lcb@hcss-ecs-1cde:~/gitcode$ git add file2 file3
lcb@hcss-ecs-1cde:~/gitcode$ git commit -m"add 3 files"
[master d908770] add 3 files
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
 create mode 100644 file2
 create mode 100644 file3

5.2 查看历史提交命令

git log命令可查看所有提交记录,支持多种格式展示:

  • 完整历史:git log,显示每个版本的作者、提交时间、提交说明及commit id(版本号);
  • 简化展示:git log --pretty=oneline,一行显示一个版本,包含commit id和提交说明
bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ git log
commit d908770ac1a99192cb8f272a3f4cb0ef9397ba99 (HEAD -> master)
Author: Milestone <3451978561@qq.com>
Date:   Sun Jan 11 10:21:25 2026 +0800

    add 3 files

commit ef866eba4f5a0727c0ce203db456b4e098743da1
Author: Milestone <3451978561@qq.com>
Date:   Sun Jan 11 10:13:41 2026 +0800

    add first file
lcb@hcss-ecs-1cde:~/gitcode$ git log --pretty=oneline
d908770ac1a99192cb8f272a3f4cb0ef9397ba99 (HEAD -> master) add 3 files

5.3 查看.git文件

先来看看.git的目录结构

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-merge-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── push-to-checkout.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 14
│   │   └── db9e31a49e865f88d288e094b8f966cfb61af4
│   ├── 93
│   │   └── 405992a282d22cca0d036c5f58279be5d1bee7
│   ├── a2
│   │   └── 35663f71d81435036448d67e6f7745450d4200
│   ├── d9
│   │   └── 08770ac1a99192cb8f272a3f4cb0ef9397ba99
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── ef
│   │   └── 866eba4f5a0727c0ce203db456b4e098743da1
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

18 directories, 28 files
  • index就是我们的暂存区,我们git add文件就是提交到这里
  • HEAD就是指向master分支的指针
bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ cat .git/HEAD
ref: refs/heads/master 
//master的默认分支
lcb@hcss-ecs-1cde:~/gitcode$ cat .git/refs/heads/master
d908770ac1a99192cb8f272a3f4cb0ef9397ba99

d908770ac1a99192cb8f272a3f4cb0ef9397ba99,这个打印出来的就是最新commit的id

  • objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏ git add 命令
    时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处:
bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ ls .git/objects
14  93  a2  d9  e6  ef  info  pack

查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。
找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的⽂件,好在我们可以使⽤git cat-file 命令来查看版本库对象的内容:

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ git cat-file -p d908770ac1a99192cb8f272a3f4cb0ef9397ba99
tree 93405992a282d22cca0d036c5f58279be5d1bee7
parent ef866eba4f5a0727c0ce203db456b4e098743da1
author Milestone <3451978561@qq.com> 1768098085 +0800
committer Milestone <3451978561@qq.com> 1768098085 +0800

add 3 files

我们可以发现这就是我们最近的一次提交

其中,还有一行 tree 93405992a282d22cca0d036c5f58279be5d1bee7,我们使用同样的方法,看看结果:

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ git cat-file -p 93405992a282d22cca0d036c5f58279be5d1bee7
100644 blob a235663f71d81435036448d67e6f7745450d4200	ReadMe
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	file3

我们再对ReadMe对应的a235663f71d81435036448d67e6f7745450d4200查看,发现就是我们提交的内容

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ git cat-file -p a235663f71d81435036448d67e6f7745450d4200
Hello Milestone

总结

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

六.Git追踪管理的是修改

  1. 对前面的ReadMe文件进行添加Hello world
  2. 使用git status,查看状态
bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ vim ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   ReadMe

可以发现,它提示我们master没有修改,但工作区的ReadMe进行了修改

如果只是普通 小型文件,我们使用cat可以,但如果一个大项目呢?

  • 使用 git diff 文件名
bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index a235663..317320a 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1 +1,2 @@
 Hello Milestone
+Hello world
  • 其中a/ReadMe就是修改前 b/ReadMe就是修改后
  • 而 -也代表修改前,-1 就代表修改前的第一行内容
  • +代表修改后 +1,2 代表修改后的第一行到第二行内容

将ReadMe提交再查看状态

bash 复制代码
lcb@hcss-ecs-1cde:~/gitcode$ git add ReadMe
lcb@hcss-ecs-1cde:~/gitcode$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   ReadMe

lcb@hcss-ecs-1cde:~/gitcode$ git commit -m"modify ReadMe"
[master 9abf140] modify ReadMe
 1 file changed, 1 insertion(+)
lcb@hcss-ecs-1cde:~/gitcode$ git status
On branch master
nothing to commit, working tree clean

可以发现

  • git add后,提示我们暂存区被修改了,和被修改的文件
  • git commit后告诉我们,没有被修改的了
相关推荐
小欣加油2 小时前
leetcode 42 接雨水
c++·算法·leetcode·职场和发展
hekung2 小时前
maven的lifecycle与idea的run
java·maven
ZXF_H2 小时前
VSCode C/C++函数Ctrl+鼠标点击无法跳转的解决方法
c++·ide·vscode
tankeven2 小时前
动态规划专题(14):石子合并问题(未完待续)
c++·算法·动态规划
阿维的博客日记2 小时前
为什么 ConcurrentHashMap 采用 synchronized 加锁而不采用ReentrantLock
java·juc
阿丰资源2 小时前
java项目(附资料)-基于SpringBoot+MyBatisPlus+MySQL+Layui的药品管理系统
java·spring boot·mysql
云恒要逆袭2 小时前
Java SE、EE、ME到底啥区别?我被这个问题困扰了一整年
java·java ee
像素猎人2 小时前
大学算法类竞赛的常用模板【自己总结+收录的】【c++版】
数据结构·算法·排序算法·算法竞赛常用算法
xianluohuanxiang2 小时前
高精度气象:极端天气一来,零售最先出问题的不是客流,而是补货体系和损失控制
开发语言·人工智能·深度学习·机器学习·零售