【Git 精品详解】基本操作:仓库区域、基本命令、版本控制

Git 本地仓库完全指南:从安装到版本穿梭

在这里插入图片描述

🌈 say-fall:个人主页
🚀 专栏:《手把手教你学会C++》 | 《系统深入Linux操作系统》 | 《数据结构与算法》 | 《小游戏与项目》
💪 格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。

📝 前言

提到 版本控制,很多人的第一反应是"听不懂,但又好像很重要"。

其实你可能早就用过了——只是没意识到。比如你写论文的时候,是不是经常这样命名文件:毕业论文v1.docx毕业论文v2_导师修改版.docx毕业论文_终版不要改.docx毕业论文_这次真的终版.docx毕业论文_打死也不再改.docx……

每次改完都要 Ctrl+CCtrl+V 复制一份新文件,文件越来越多,多到最后自己都搞不清哪个版本改了什么。这还只是你一个人写,要是 5 个人一起协作写一个项目呢?文件传来传去,版本混乱、合并冲突、改动丢失——这些场景在程序员的世界里,每天都在上演。

🎯 本节目标:带你彻底搞懂 Git 是什么、为什么需要版本控制器、怎么在自己的电脑上装上 Git,并完成从 创建本地仓库 → 添加文件 → 修改/删除文件 → 版本回退 → 撤销修改 的全流程实操。学完之后,你不仅能熟练使用 Git 管理自己的代码,更能为下一篇的"分支管理"打下坚实基础。

通过本文,你将掌握:

技能应用场景
理解 Git 与版本控制器的本质面试必问,转岗必备
在 Windows/Linux/macOS 三平台安装 Git任何开发环境都跑得起来
认识工作区、暂存区、版本库三大核心区域理解 Git 底层原理的关键
熟练使用 add / commit / log / status / diff日常开发的 80% 操作
玩转 reset / reflog / checkout 三大版本穿梭神器误删误改、版本回退都不慌

📌 前置知识: 会基础命令行操作(cdlsmkdir 这类),有一台能联网的电脑,零 Git 基础也可以跟上。本系列所有命令都在 user@localhost 的虚拟环境下演示,复制粘贴前记得改成自己的环境。

文章目录


一、🔍 Git 究竟是个什么东西

1.1 什么是版本控制器

在正式聊 Git 之前,我们先搞清楚版本控制器这个概念。

💡 一句话解释:版本控制器就是一个能记录文件每一次改动、让你随时回溯到任意历史版本的系统。

想象一下,你在写一份超长报告。每次改完都 Ctrl+S,但万一改错了想恢复昨天的版本?传统的做法是手动复制备份,但备份多了你也记不清哪个是哪个。版本控制器就是来解决这个问题的——它会自动帮你记录每一次"保存",并且支持随时回退、对比、合并。

版本控制器的发展经历了三个阶段:

阶段名称特点缺点
第一代本地版本控制在自己电脑上用软件记录版本(RCS)无法多人协作
第二代集中式版本控制有一台中央服务器存所有版本(SVN、CVS)服务器挂了 = 全部完蛋
第三代分布式版本控制每个人电脑都有完整版本库(Git学习曲线略陡

我们今天要学的 Git,就是当前最主流的分布式版本控制系统

1.2 Git 的核心特点

Git 之所以能成为行业标准,靠的是这几个"硬核"特性:

① 分布式

这是 Git 最大的特点。没有中央服务器的概念,每个人本地都是完整版本库。这意味着:

  • 没有网络也能提交、查看历史、回退版本
  • 某台电脑坏了,从其他人的本地就能完整恢复
  • 真正的"去中心化"设计

② 高效的存储和性能

Git 用了一种叫 “快照流” 的存储方式,每次提交记录的是文件的快照(而不是差异)。这让它在大型项目里依然飞快——Linus Torvalds(Linux 之父)最初开发 Git 就是为了管理 Linux 内核(千万行代码级别)。

③ 强大的分支支持

Git 的分支操作几乎"零成本"——创建、切换、合并分支在毫秒级完成。这也是为什么后续我们要专门用一整篇博客讲分支管理。

④ 完整性保证

Git 内部用 SHA-1 哈希算法对所有文件内容计算校验和,任何文件被篡改都能立刻发现。

⚠️ 小贴士:Git 只能跟踪"文本文件"的改动,对于图片、视频、Word 这类二进制文件,Git 也能管理,但只能记录大小变化,无法记录具体改了什么。

1.3 你需要理解的基础概念

在动手操作前,先把几个"行话"装进脑子里:

  • 仓库(Repository):通俗说就是你的项目文件夹,被 Git 接管后就叫仓库。Git 通过这个文件夹里的隐藏目录 .git 来追踪一切。
  • 工作区(Working Directory):你实际看到的、能编辑文件的目录。
  • 暂存区(Stage / Index):一个临时存放区域,介于工作区和版本库之间。你可以理解为"购物车"——把想提交的文件先放进来,确认无误再"结账"。
  • 版本库(Repository):Git 用来保存项目历史记录和元信息的地方,通常就是 .git 这个隐藏目录。
  • 提交(Commit):把暂存区的内容正式保存到版本库,形成一个"历史快照"。
  • 分支(Branch):在主线之外开辟的独立开发线,互不干扰。后

下面这张图概括了这些核心概念之间的关系:

“git add”

“git commit”

“git checkout”

“项目文件夹
Project Folder”

“执行 git init”

“Git 仓库
Repository”

“隐藏目录 .git
版本库”

“工作区
Working Directory”

“暂存区
Stage / Index”

“提交历史
Commit History”

面会专门讲。

1.4 Git ≠ GitHub

很多人会把这两个搞混,必须澄清一下:

  • Git:一个软件,装在你电脑上,负责版本控制
  • GitHub:一个网站,提供 Git 仓库的远程托管服务(类似网盘)

类比一下:Git 是"记账本",GitHub 是"线上账本存储平台"。还有 Gitee(码云)、GitLab、Bitbucket 等类似平台。

💡 本篇只讲本地操作,不涉及 GitHub。下一篇讲远程操作时再带大家一起玩 GitHub/Gitee。


二、🛠️ 三平台安装 Git

工欲善其事,必先利其器。Git 的安装在不同系统下略有差异,我们分别来看。

2.1 Windows 平台安装

第一步:下载安装包

去 Git 官网(https://git-scm.com/download/win)下载对应你系统的安装包。如果官网下载慢,也可以用国内的镜像源。

第二步:双击安装

一路 Next 即可,但要留意几个关键选项:

  • Select Components:默认全选,保持默认
  • Choosing the default editor used by Git:默认是 Vim,但 Vim 对新手不友好。建议改成 VS Code(前提是你装了 VS Code)
  • Adjusting your PATH environment:选 Git from the command line and also from 3rd-party software(推荐)
  • Choosing HTTPS transport backend:选 Use the OpenSSL library
  • Configuring the line ending conversions:选 Checkout Windows-style, commit Unix-style line endings(避免跨平台换行符问题)

第三步:验证安装

打开 Git Bash(开始菜单里搜 Git Bash),输入:

git --version

看到类似 git version 2.42.0.windows.1 的输出就说明装好了。

⚠️ 注意:在公司或学校电脑上装软件可能没管理员权限,这时候推荐用 Scoop 或 Chocolatey 包管理器安装,或者用便携版 Git。

2.2 macOS 平台安装

macOS 用户有福了,最推荐用 Homebrew

# 1. 没装 Homebrew 的话先装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 2. 一行命令装 Git
brew install git

如果不想用 Homebrew,也可以:

  • 从官网下载 .dmg 安装包:https://git-scm.com/download/mac
  • 或者装 Xcode Command Line Tools:xcode-select --install(会顺带装上 Git,但版本可能偏旧)

验证安装:

git --version

2.3 Linux 平台安装

CentOS / RedHat 系列:

# 先试一下系统里有没有
git --version
# 如果提示 command not found,就装一下
sudo yum install -y git

Ubuntu / Debian 系列:

sudo apt-get install -y git

Arch Linux:

sudo pacman -S git

💡 Linux 发行版自带的 Git 版本可能不是最新的,如果要最新版,建议从源码编译或者用 PPA 源。

2.4 安装后的首次配置

装好 Git 后,第一件事就是配置你的用户名和邮箱。这两步配置非常重要,因为 Git 每次提交都会记录是谁提交的:

# 配置全局用户名(替换成你的名字)
git config --global user.name "Your Name"

# 配置全局邮箱(替换成你的邮箱)
git config --global user.email "your.email@example.com"

💡 --global 表示全局配置,这台机器上所有 Git 仓库都会用这个身份。如果你想在某个项目里用不同身份,可以进到那个项目目录里,不加 --global 再配一次,会覆盖全局配置。

查看所有配置:

git config --list

删除某个配置项:

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

⚠️ 别用真实的邮箱!如果你不想被爬虫骚扰,可以去 https://github.com/settings/emails 申请一个 GitHub 提供的隐私邮箱(格式是 ID+username@users.noreply.github.com)。


三、🏗️ 创建你的第一个 Git 本地仓库

Git 装好了,配置也好了,是时候上手实战了。

3.1 什么是"仓库"

💡 仓库(Repository)本质上就是一个目录,只不过这个目录被 Git "接管"了。Git 会在这个目录下创建一个隐藏的 .git 文件夹,用来追踪所有文件的改动。

要使用 Git 管理代码,第一步就是创建仓库

3.2 创建本地仓库

Git 提供了 git init 命令来初始化一个本地仓库:

# 1. 先创建一个项目目录
mkdir /home/user/test/my-first-repo
cd /home/user/test/my-first-repo

# 2. 在该目录下执行 git init
git init

执行成功后,你会看到类似这样的输出:

Initialized empty Git repository in /home/user/test/my-first-repo/.git/

⚠️ git init 命令必须在你想变成仓库的那个目录里执行,不然会创建到错误的地方。

.git 目录里有什么?

# 用 tree 命令看一下(Linux/macOS)
tree -a .git

# Windows PowerShell 可以用
Get-ChildItem -Force .git

你会看到类似这样的结构:

.git/
├── branches
├── config
├── description
├── HEAD
├── hooks/
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   └── ... (其他钩子脚本)
├── info/
│   └── exclude
├── objects/
│   ├── info/
│   └── pack/
└── refs/
    ├── heads/
    └── tags/

⚠️ 千万不要手动修改 .git 里的任何文件!改坏了你的仓库就废了。Git 会自动管理这些文件。

3.3 认识工作区、暂存区、版本库

这是 **理解 Git 原

“Git 三区流转”

“git add <文件>”

“git commit -m ‘说明’”

“git checkout <文件>”

“工作区
Working Directory
可见可编辑的文件”

“暂存区
Stage / Index
git add 后的文件”

“版本库
Repository
.git 目录,历史快照”

────────┘


**工作区(Working Directory)**:你实际看到的、能用编辑器改文件的那个目录。

**暂存区(Stage/Index)**:可以理解为"准备区"。用 `git add` 把工作区的改动放进暂存区。用 `git status` 能看到暂存区里有什么。

**版本库(Repository)**:`.git` 这个隐藏目录。用 `git commit` 把暂存区的内容真正写入版本库,形成一个历史快照。

> <font color="#9B59B6">💡 三区关系:工作区 → add → 暂存区 → commit → 版本库。理解了这个流程,你就理解了 Git 80% 的工作原理。</font>

---

## 四、📝 添加文件:场景一

理论讲完了,现在动手干。

### 4.1 创建并提交第一个文件

**第一步:在工作区创建一个文件**

```bash
# 进入你的仓库目录
cd /home/user/test/my-first-repo

# 创建一个 ReadMe 文件
touch ReadMe

# 写点内容进去(用 echo 或 vim 都行)
echo "hello git" > ReadMe
echo "这是我的第一个 Git 仓库" >> ReadMe

第二步:用 git add 添加到暂存区

git add ReadMe

💡 git add 是把文件从工作区"放到购物车"(暂存区),并不是真的提交。

第三步:用 git commit 正式提交

git commit -m "添加 ReadMe 文件"

-m 后面跟着的是提交说明,用来描述这次提交做了什么。绝对不能省略,良好的提交习惯是程序员的基本素养。

执行成功后你会看到:

[master (root-commit) abc1234] 添加 ReadMe 文件
 1 file changed, 2 insertions(+)
 create mode 100644 ReadMe

这段输出告诉你:

  • 这是 master 分支上的根提交(第一次提交)
  • commit id 是 abc1234...(SHA-1 哈希值)
  • 1 个文件被改动,新增了 2 行

4.2 一次添加多个文件

Git 允许你把多个改动一次性提交。多次 add,一次 commit

# 创建多个空文件
touch file1 file2 file3

# 分别 add 到暂存区
git add file1
git add file2
git add file3

# 一次 commit
git commit -m "添加 3 个空文件"

你会看到输出:

[master def5678] 添加 3 个空文件
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
 create mode 100644 file2
 create mode 100644 file3

💡 “多次 add 不同的文件,而只 commit 一次” 是 Git 的标准工作流。原因是:所有需要提交的文件都先 add 到暂存区,commit 时 Git 会把暂存区里所有的改动一次性写入版本库。

4.3 git add 的几种常用姿势

git add 不止 git add 文件名 这一种用法:

# 添加指定文件
git add file1 file2

# 添加指定目录(包括子目录)
git add ./src/

# 添加当前目录所有改动(最常用)
git add .

4.4 查看提交历史:git log

提交了几次之后,怎么看历史记录呢?

git log

输出类似:

commit def5678901234567890abcdef1234567890abcdef (HEAD -> master)
Author: Your Name <your.email@example.com>
Date:   Thu Jun 25 15:30:00 2026 +0800

    添加 3 个空文件

commit abc1234567890abcdef1234567890abcdef123456
Author: Your Name <your.email@example.com>
Date:   Thu Jun 25 15:25:00 2026 +0800

    添加 ReadMe 文件

嫌输出太多?加 --pretty=oneline 参数:

git log --pretty=oneline

输出精简版:

def5678901234567890abcdef1234567890abcdef (HEAD -> master) 添加 3 个空文件
abc1234567890abcdef1234567890abcdef123456 添加 ReadMe 文件

💡 那一长串类似 def5678... 的字符就是 commit id(版本号)。它是 SHA-1 算法算出来的哈希值,全世界唯一标识这次提交。

4.5 深入 .git 目录

前面说了 .git 是版本库,里面的内容不要手动改。但了解一下能帮你理解 Git 原理:

# 查看 HEAD 文件
cat .git/HEAD
# 输出:ref: refs/heads/master

# 查看 master 分支指向的 commit
cat .git/refs/heads/master
# 输出:def5678901234567890abcdef1234567890abcdef

# 看看 objects 目录
ls .git/objects/
# 输出:23  83  8f  9c  c6  e6  info  pack

objects 目录是 Git 的对象库。每次 git add,Git 都会在工作区里被修改的文件内容写入 objects 目录的一个新对象里。

查看某个对象的内容:

git cat-file -p def5678901234567890abcdef1234567890abcdef

你会看到这次提交的详细信息:作者、提交者、父 commit、tree 对象等。

总结一下三个关键目录:

  • index:就是暂存区,add 后内容会更新到这里
  • HEAD:默认指向 master 分支的指针
  • refs/heads/master:保存当前 master 分支最新 commit id 的文件
  • objects:包含创建的各种版本库对象及内容

💡 建议在学习过程中多 cat 一下 .git 目录里的文件,把 git addgit commit 后的变化对应起来。这能让你对 Git 底层有更深的理解。


五、✏️ 修改文件与状态查看

有了初始文件后,我们开始改文件。

5.1 修改文件

直接在编辑器里改 ReadMe 就行:

# 查看当前内容
cat ReadMe
# 输出:
# hello git
# 这是我的第一个 Git 仓库

# 用 vim 或 echo 修改(这里用 echo 演示)
echo "hello version2" >> ReadMe

# 再次查看
cat ReadMe
# 输出:
# hello git
# 这是我的第一个 Git 仓库
# hello version2

5.2 查看仓库状态:git status

git status 是你用得最多的命令之一。它能告诉你当前工作区和暂存区的状态

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

no changes added to commit (use "git add" and/or "git commit -a")

这段输出告诉你:

  • 当前在 master 分支
  • ReadMe 被修改了,但还没有 add 到暂存区
  • 没有任何文件被 add(“no changes added to commit”)

5.3 看具体改了什么:git diff

git status 只能告诉你"哪些文件改了",但具体改了什么得用 git diff

git diff ReadMe

输出:

diff --git a/ReadMe b/ReadMe
index 9c9e1f0..4a97140 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1,2 +1,3 @@
 hello git
-这是我的第一个 Git 仓库
+这是我的第一个 Git 仓库
+hello version2

这个输出格式是 Unix 标准的 diff 格式

  • - 开头的行是被删除的
  • + 开头的行是新加的

💡 git diff 默认比较的是工作区和暂存区的区别。如果想看工作区和版本库的区别,用 git diff HEAD -- 文件名

5.4 把修改提交到版本库

# 1. 添加到暂存区
git add ReadMe

# 2. 查看状态
git status
# 输出:Changes to be committed: modified: ReadMe
# (注意提示语从 "not staged" 变成了 "to be committed")

# 3. 正式提交
git commit -m "添加 hello version2 行"

💡 提交后 git status 会显示 “nothing to commit, working tree clean”,表示工作区干净了,所有改动都已提交。


六、⏪ 版本回退:玩转 reset

这是 Git 最神奇的功能之一——回到过去。

6.1 为什么要版本回退

实际开发中,改错了、误删了、写崩了这些情况太常见了:

  • 写完代码发现思路错了,想重新开始
  • 提交了敏感信息(密码、密钥)想撤回
  • 老板说"还是用上一版吧"

这时候就需要版本回退。

6.2 准备测试数据

我们准备 3 个版本,依次提交:

# 版本 1
echo "version1" >> ReadMe
git add ReadMe
git commit -m "version1"

# 版本 2
echo "version2" >> ReadMe
git add ReadMe
git commit -m "version2"

# 版本 3
echo "version3" >> ReadMe
git add ReadMe
git commit -m "version3"

# 查看历史
git log --pretty=oneline
# 输出:
# d95c13f... (HEAD -> master) version3
# 14c12c3... version2
# cff9d1e... version1

6.3 git reset 命令详解

git reset 是版本回退的核心命令。语法:

git reset [--soft | --mixed | --hard] [HEAD]

三个参数的区别:

参数工作区暂存区版本库适用场景
--soft保持不变保持不变回退想重新组织提交
--mixed(默认)保持不变回退回退撤销 add,保留改动
--hard回退回退回退彻底回退(慎用!)

HEAD 的几种写法:

  • HEAD:当前版本
  • HEAD^:上一个版本
  • HEAD^^:上上一个版本
  • HEAD~1:上一个版本
  • HEAD~10:上 10 个版本

也可以直接写 commit id(不需要写全,写前 7 位就能唯一定位)。

6.4 实战:从 v3 回退到 v2

# 1. 先看历史
git log --pretty=oneline
# d95c13f... (HEAD -> master) version3
# 14c12c3... version2
# cff9d1e... version1

# 2. 回退到 v2(--hard 会让工作区也回到 v2 状态)
git reset --hard 14c12c3

# 输出:HEAD is now at 14c12c3 version2

# 3. 查看文件
cat ReadMe
# 输出:version1、version2
# (v3 的内容没了!)

warning: --hard 会把工作区、暂存区、版本库全部回退。工作区里没提交的内容也会被清空

⚠️ 慎用 --hard!如果只是想让暂存区回到上一个版本,用 git reset HEAD 文件名(默认 --mixed),这样工作区文件不动。

6.5 回退后又想回去怎么办?

git log 只能看到当前版本及之前的版本,回退后看不到 v3 了。这时候就要用 git reflog

git reflog
# 输出:
# 14c12c3 (HEAD -> master) HEAD@{0}: reset: moving to 14c12c3
# d95c13f HEAD@{1}: commit: version3
# 14c12c3 (HEAD -> master) HEAD@{2}: commit: version2
# cff9d1e HEAD@{3}: commit: version1

git reflog 记录了本地每一次 Git 命令的操作。从输出里我们看到 d95c13f 是 v3 的 commit id 部分,可以重新 reset 回去:

git reset --hard d95c13f
# 输出:HEAD is now at d95c13f version3

💡 git reflog 是 Git 里的"后悔药"。只要你的代码没推送到远程(即使删了分支,reflog 也能找到),用 reflog 几乎都能找回来。

⚠️ 但是!但是!如果你已经 git push 到远程了,回退会非常麻烦——下一篇讲远程操作时会详细说怎么处理。


七、↩️ 撤销修改:场景分析

版本回退是针对已提交的内容,但更多时候我们想撤销的是还没提交的工作区改动

7.1 场景一:工作区改了,没 add

代码写到一半,越写越乱,想恢复到上次 add/commit 时的状态:

# 1. 模拟错误修改
echo "This is a mess" >> ReadMe

# 2. 查状态
git status
# 输出:Changes not staged for commit: modified: ReadMe

# 3. 撤销(注意 -- 不能省!)
git checkout -- ReadMe

# 4. 验证
cat ReadMe
# 错误代码没了!

⚠️ git checkout -- 文件名 中的 -- 非常重要!省略后 git checkout 的含义会完全不同(变成分支切换)。

7.2 场景二:已经 add,但没 commit

git checkout 只能恢复工作区,对暂存区无效。这时候要用 git reset

# 1. 错误修改并 add
echo "This is still a mess" >> ReadMe
git add ReadMe

# 2. 查状态
git status
# 输出:Changes to be committed: modified: ReadMe
# (注意:提示语变成 "to be committed" 了)

# 3. 把暂存区回退到 HEAD 版本(默认 --mixed)
git reset HEAD ReadMe

# 4. 查状态
git status
# 输出:Changes not staged for commit: modified: ReadMe
# (回到场景一了!)

# 5. 再用 checkout 撤销工作区
git checkout -- ReadMe

💡 git reset HEAD 文件名 不会动工作区文件,只会把暂存区里的对应文件"退回去"。

7.3 场景三:已经 add 并 commit 了

如果你已经 commit 了,又想撤回这次提交,可以:

# 回退到上一个版本
git reset --hard HEAD^

⚠️ 但这有前提——你还没有把本地版本库推送到远程(下一篇会讲)。一旦推送了,回退会非常麻烦。

7.4 三种场景对比表

场景操作命令
工作区改了,没 add撤销工作区git checkout -- 文件名
已 add,没 commit先撤销暂存区,再撤销工作区git reset HEAD 文件名 + git checkout -- 文件名
已 add 也 commit 了回退版本`git reset –

为了更直观地判断在何种场景下使用哪个命令,可以参考下面的决策流程图:

“否”

“是”

“否”

“是”

“否”

“是”

“开始:文件已修改”

“修改已添加到暂存区
git add 了吗?”

“场景一:工作区改了,没 add”

“使用命令:
git checkout -- <文件>”

“修改已提交到版本库
git commit 了吗?”

“场景二:已经 add,没 commit”

“第一步:撤销暂存区
git reset HEAD <文件>”

“第二步:撤销工作区
git checkout -- <文件>”

“场景三:已经 add 并 commit”

“⚠️ 是否已推送远程?
git push 了吗?”

“可回退版本
git reset --hard HEAD^”

“谨慎操作!
需用 git revert 等”

“文件恢复至上次提交状态”

hard HEAD^`(慎用) |


八、🗑️ 删除文件

删除文件也是 Git 中的常见操作。

8.1 普通删除文件

# 1. 用 rm 命令删除文件
rm file1

# 2. 查状态
git status
# 输出:deleted: file1

# 3a. 删错了?恢复!
git checkout -- file1

# 3b. 确认要删除?add + commit
git rm file1
git commit -m "删除 file1"

💡 git rm 文件名 等价于 rm 文件名 + git add 文件名,一步到位把文件从工作区和暂存区都删除。

8.2 删除文件时的状态

操作工作区暂存区版本库
rm file1删了没改没改
git add file1删了标记删除没改
git commit删了删了标记删除

💡 在 Git 里,删除也是一种修改。你删的文件不是真的从历史里消失了——用 git log 还能看到,必要时可以恢复。


九、❓ 本节常见问题解答

学到这里,相信你已经能上手 Git 了。但总有些"灵魂拷问"会让你卡壳。本节挑了 3 个跟本地仓库最相关的疑问,逐一解答。

💡 剩下 6 个问题(颜色配置、--no-ff 合并、stash 用法、冲突解决、远程分支拉取等)会在后续分支管理、远程操作两篇里专门展开。

1️⃣ git loggit reflog 有什么区别?

答:

  • git log:显示当前分支的提交历史,从最新到最远
  • git reflog:显示本地仓库的所有操作记录(包括 reset、commit、merge 等)

最常用的场景:版本回退后想找回去git log 看不到回退前的版本,但 git reflog 能。

💡 reflog 是 Git 里的"后悔药",但只对本地有效。git reflog 默认只显示当前分支的操作历史。

2️⃣ master 指向 v3,改成 v2 后再提交 v3 会被覆盖吗?

答:不会。

Git 提交时不会检查你提交的内容是否"已经存在"。即使你 reset 回到 v2 后再 commit v3 一次,v3 也会作为一个新的 commit 出现在历史里(commit id 会不同)。

Git 用 commit id 区分不同提交,即使内容一样,commit id 也不一样(因为时间戳、作者、parent 等元信息不同)。

3️⃣ git reset 能不能加文件名?

答:可以!

git reset 文件名--mixed 模式,只把指定文件从暂存区退回工作区(不影响其他已 add 的文件):

# 1. 暂存区有 file1 和 file2
git add file1 file2

# 2. 只把 file1 撤出暂存区
git reset file1
# file1 回到工作区,file2 还在暂存区

💡 这种用法在"提交时漏了几个文件"或"误 add" 时特别有用。


十、🎯 实战练习:完成你的第一个完整工作流

理论 + 单命令都讲了,最后来个完整的实战小项目,让你把所有命令串起来。

任务:

  1. /home/user/test/practice 下创建一个叫 git-practice 的仓库
  2. 创建一个 notes.txt,写 “Day 1: Git 入门”
  3. 提交一次(commit message: “开始学习 Git”)
  4. 修改 notes.txt,加上 “Day 2: 版本控制”
  5. 提交一次
  6. git log --pretty=oneline 查看历史
  7. 回退到第一次提交
  8. git reflog 找回来

参考命令:

# 1. 创建目录并初始化
mkdir -p /home/user/test/practice/git-practice
cd /home/user/test/practice/git-practice
git init

# 2. 创建文件
touch notes.txt
echo "Day 1: Git 入门" > notes.txt

# 3. 第一次提交
git add notes.txt
git commit -m "开始学习 Git"

# 4. 修改文件
echo "Day 2: 版本控制" >> notes.txt
cat notes.txt

# 5. 第二次提交
git add notes.txt
git commit -m "Day 2: 版本控制"

# 6. 查看历史
git log --pretty=oneline

# 7. 回退到第一次提交(用 HEAD^ 表示上一个)
git reset --hard HEAD^

# 8. 用 reflog 找回来
git reflog
# 看到第二次提交的 commit id 后:
git reset --hard <commit_id>

跑一遍这个流程,你对 Git 的理解会上一个台阶。


十一、📌 关键命令速查表

命令作用
git init初始化本地仓库
git config --global user.name "..."配置用户名
git config --global user.email "..."配置邮箱
git add <file>添加文件到暂存区
git add .添加所有改动到暂存区
git commit -m "..."提交暂存区内容到版本库
git status查看仓库状态
git diff查看工作区 vs 暂存区的差异
git log查看提交历史
git log --pretty=oneline简洁版历史
git reflog查看所有操作记录
git reset --hard <commit>彻底回退(慎用)
git reset HEAD <file>撤销 add
git checkout -- <file>撤销工作区修改
git rm <file>删除文件
`gi

十一、📊 Git 本地工作流全景图

至此,我们已经学习了 Git 本地操作的几乎所有核心命令。为了帮助你从全局视角理解这些命令如何串联成一个完整的工作流,请看下面的全景图:

“是”

“是”

“否”

“否”

“是”

“否,想撤销”

“是”

“否”

“继续开发”

“版本回退”

“是”

“否”

“删除文件”

“项目完成/暂停”

“开始一个新项目/功能”

“git init
初始化仓库”

“在工作区修改文件”

“检查状态?”

“git status
查看哪些文件被修改”

“查看具体改动?”

“git diff
查看工作区与暂存区差异”

“满意,准备提交?”

“git add .
添加改动到暂存区”

“git checkout -- <文件>
丢弃工作区修改”

“git commit -m ‘说明’
提交到版本库,生成新快照”

“查看历史?”

“git log / git log --oneline
查看提交历史”

“下一步?”

“git reset --hard
回退到指定版本”

“后悔了?”

“git reflog
查看所有操作记录找回commit”

“git reset --hard <旧commit>”

“git rm <文件>
从工作区和暂存区删除”

“本地工作流结束”

这张图概括了从初始化到日常修改、提交、查看历史、回退、撤销的完整闭环。建议在实战中对照此图,加深对命令之间联系的理解。
t clone ` | 克隆远程仓库 |


十二、🤔 几个思考题

学完本文,来试试回答这些问题:

1️⃣ git reset --hard HEAD^git reset --soft HEAD^ 有什么区别?

答:

  • --hard:工作区、暂存区、版本库全部回退到上一个版本。工作区里没提交的内容会丢失。
  • --soft:只有版本库回退,工作区和暂存区不变。可以重新组织提交。

简而言之:--hard 是"什么都不要了",--soft 是"我想重新提交"。

💡 HEAD^ 也可以写成 HEAD~1,都表示上一个版本。

2️⃣ git rm 和直接 rm 有什么区别?

答:

  • rm 是系统命令,只删工作区文件,Git 暂存区还保留着这个文件的"记录"
  • git rm 把工作区和暂存区的文件都删了,并把"删除"这个操作放到暂存区,等下次 commit

简单说:rm 是普通删除,git rm 是告诉 Git “我准备把这个文件从版本库里删除”。

3️⃣ 误删了工作区文件,怎么恢复?

答:分两种情况:

  • 文件已经被 Git 追踪过:用 git checkout -- 文件名 可以恢复到最近一次 commit 的状态
  • 文件没被 Git 追踪过(新创建但没 add):对不起,Git 救不了你。可以试试系统回收站或数据恢复软件

💡 这是为什么建议"频繁 add/commit"——给 Git 多留点"后悔药"。

4️⃣ git log --pretty=oneline 里的 commit id 为什么要写那么长?

答:commit id 不需要写全。

Git 用 SHA-1 哈希生成 commit id,理论上只要前 7-8 位就能唯一定位一个 commit(除非你的项目有几万个 commit)。

git reset --hard abc1234git reset --hard abc1234567890abcdef1234567890abcdef123456 效果完全一样。Git 会自动用最短前缀匹配。

💡 但写完整 commit id 更安全(避免前缀冲突),尤其是在 git log 输出里复制粘贴时。

5️⃣ 为什么 git checkout -- file 中的 -- 不能省?

答:git checkout 有两个完全不同的用法。

  • git checkout -- file:撤销工作区修改(用版本库的文件覆盖工作区)
  • git checkout branch_name:切换到指定分支

如果省略 --,Git 可能会把你的 ReadMe 当成"分支名"来切换,触发错误。所以 git checkout -- 后面必须接文件路径时,-- 是必须的

💡 现在的 Git(2.23+)推荐用 git restore 文件名 替代 git checkout -- 文件名,语义更清晰。


写在最后

到这里,《Git 本地仓库完全指南》就告一段落了 🎉

我们从"什么是版本控制器"开始,到安装 Git、配置身份,再到创建本地仓库、添加/修改/删除文件、版本回退、撤销修改,把 Git 本地操作的核心场景全部走了一遍。

下一篇我们要进入 Git 最强大也最让人迷惑的功能——分支管理。你会学到:

  • 分支到底是什么(用时间线图彻底讲透)
  • 创建、切换、合并、删除分支
  • 怎么解决合并冲突
  • 团队开发必备的分支策略(master / develop / feature / hotfix)
  • Bug 分支的正确打开方式

理解分支是迈向 Git 高手的关键一步。我们下一篇见!

📝 思考题答案强烈建议自己敲一遍命令验证一下,光看答案是记不住的。下一节我会带大家一起用 Git 玩一些更有意思的分支操作,到时候你会发现,今天打的基础全用上了。


✅ 本节完…

📝 作者:say-fall | 编辑:say-fall | 🌟 原创不易,如果对你有帮助,记得 👍 点赞 + ⭐ 收藏 哦!

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值