作为开发者,代码版本管理是日常工作的核心技能之一。最近我通过一个简单的项目,完整实践了 Git 从仓库初始化到版本回退、文件修改跟踪的全流程,整理了这份包含真实命令和场景的实战笔记,适合刚接触 Git 的新手参考。
一、基础认知:Git 仓库的核心原则
在开始操作前,有两个关键原则必须明确:
- 一个项目对应一个 Git 仓库:同一个项目目录下不能存在多个 Git 仓库,否则会导致版本跟踪混乱,所有代码应放在同一个仓库中统一管理。
- Git 跟踪的是 "版本变化" :无论是新建文件、修改内容还是删除文件,Git 都会记录每一次变更,通过唯一的哈希值区分不同
版本,而非仅关注文件本身。
| 工作区名称 | 含义与作用 | 对应操作命令 | 状态标识(git status 显示) |
|---|---|---|---|
| 工作区 | 本地可见的项目目录,用于日常编辑代码的地方,所有新增、修改、删除操作先在这里发生。 | 直接在文件夹中编辑 / 删除文件(无 Git 命令) | 未跟踪(Untracked files)、已修改未暂存(modified) |
| 暂存区 | 临时存储待提交的变更,相当于 "待提交缓冲区",可选择性选择部分修改提交,而非全部。 | git add <文件>(添加到暂存区)、git reset HEAD <文件>(从暂存区移除) |
已暂存待提交(Changes to be committed) |
| 本地仓库 | 存储所有版本历史的核心区域(.git 隐藏目录),记录每次提交的完整快照,可回退到任意版本。 |
git commit -m "说明"(提交暂存区内容到仓库)、git log(查看历史) |
无(提交后暂存区清空,工作区与仓库一致时显示 "clean") |
| 远程仓库 | 网络上的共享仓库(如 GitHub/Gitee),用于多人协作同步代码,避免本地仓库丢失。 | git push(推本地仓库推送到远程)、git pull(拉取远程更新到本地) |
无(需通过 git remote 查看远程仓库配置) |
核心工作区流转关系:
- 工作区 → 暂存区:通过
git add将修改加入暂存区,准备提交。 - 暂存区 → 本地仓库:通过
git commit将暂存区内容永久保存到版本历史。 - 本地仓库 ↔ 远程仓库:通过
git push/git pull实现本地与远程的同步,支持多人协作。

| 概念 | 范围与含义 | 包含内容 |
|---|---|---|
| 版本库 | 广义上指所有存储版本信息的仓库,可分为 "本地版本库" 和 "远程版本库"。 | 所有提交的版本快照、分支、暂存区、配置等(核心是 .git 文件夹或远程服务器上的对应数据)。 |
- 本地仓库是版本库的 "本地实例",包含在广义的 "版本库" 概念中。
- 平时说的 "提交到本地仓库",其实就是 "将变更写入本地版本库的
.git文件夹"。 - 远程仓库则是版本库的 "网络实例",与本地仓库通过
git push/git pull同步数据。
二、实战流程:从仓库初始化到版本管理
下面结合我在 learn_git 项目中的真实命令,拆解日常工作中 Git 的核心操作流程。
🏃1. 初始化仓库:开启版本跟踪
当我们新建一个项目后,第一步需要初始化 Git 仓库,让 Git 开始管理项目文件。
命令:
bash
git init
作用:
- 在项目目录下创建隐藏的
.git文件夹(这是 Git 仓库的核心目录,存储所有版本信息)。 - 默认创建
master分支(部分新版本 Git 默认分支为main,本质功能一致)。 - 此时项目进入 "未跟踪" 状态,需要通过后续命令让 Git 关注具体文件。
🏃2. 文件新增:从 "未跟踪" 到 "版本记录"
工作中新建文件后,需要通过 git add 和 git commit 两步,将文件纳入 Git 版本跟踪。
步骤 1:添加文件到暂存区(git add)
新建 readme.txt 后,先通过
bash
git status
了解当前仓库的状态
plaintext
PS C:\Users\Desktop\learn_git> git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
状态标识(git status 显示) |
含义说明 | 对应阶段 / 场景 | 常用操作建议 |
|---|---|---|---|
Untracked files(未跟踪文件) |
文件是新创建的,Git 从未记录过它的版本(不在在暂存区、也不在本地仓库)。 | 新文件刚被创建,还未执行 git add 操作。 |
若需跟踪,执行 git add <文件名名> 加入暂存区;若无需跟踪,可加入 .gitignore 忽略。 |
Changes not staged for commit(已修改未暂存) |
文件已被 Git 跟踪(之前提交过),但本次修改未加入暂存区(工作区有变更,暂存区未更新)。 | 对已跟踪文件做了修改,但未执行 git add。 |
执行 git add <文件名> 将修改加入暂存区;若想丢弃修改,执行 git checkout -- <文件名>。 |
Changes to be committed(已暂存待提交) |
文件的修改已加入暂存区,等待被提交到本地仓库。 | 已执行 git add,但未执行 git commit。 |
执行 git commit -m "说明" 提交到本地仓库;若想取消暂存,执行 git reset HEAD <文件名>。 |
查看状态:发现 readme.txt 处于未跟踪状态,再用:
bash
git add 文件名
将指定文件加入暂存区(暂存区是 Git 中 "待提交" 的过渡区域)。
plaintext
# 将 readme.txt 加入暂存区
PS C:\Users\Desktop\learn_git> git add readme.txt
# 再次查看状态:文件已进入暂存区,等待提交
PS C:\Users\Desktop\learn_git> git status
On branch master
No commits yet
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: readme.txt
关键说明:
git add 文件名:单个文件添加;若要添加所有新增 / 修改文件,可使用git add .(注意:谨慎使用,避免误加无关文件)。- 暂存区的作用:允许我们选择性提交文件,比如同时修改了 A、B 两个文件,可先
git add A提交 A 的变更,后续再处理 B。
步骤 2:提交到本地仓库(git commit)
暂存区确认无误后,用 git commit -m "提交说明" 将文件正式写入版本库,生成第一个版本。
命令:
plaintext
PS C:\Users\Desktop\learn_git> git commit -m 'wrote a readme file'
[master (root-commit) ae97af2] wrote a readme file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme.txt
输出解读:
(root-commit):表示这是仓库的 "根提交",即第一次提交,初始化了版本历史。ae97af2:提交的唯一哈希值(SHA-1 校验和),用于标识这个版本,后续回退或查看时会用到,相同文件名不同版本的哈希值不同。create mode 100644 readme.txt:表示新建了一个权限为 644 的普通文件(100644 是 Linux 下的文件权限,对应 "所有者可读可写,其他用户只读",是代码文件的常见权限)。0 insertions(+), 0 deletions(-):此时readme.txt是空文件,没有新增或删除内容。
🏃3. 文件修改:跟踪内容变更
工作中最常见的场景是修改已有文件,比如给 readme.txt 添加内容,此时需要重新执行 "修改 → add → commit" 的流程。
步骤 1:修改文件并查看差异(git diff)
先编辑 readme.txt(比如添加 "Git is a version control system." 和 "Git is free software." 两行),再用 git diff 查看具体修改内容。
命令:
plaintext
# 查看 readme.txt 的修改差异
PS C:\Users\Desktop\learn_git> git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 89c45ce..0b6120c 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
\ No newline at end of file
作用:
git diff <文件名>会显示文件修改前后的对比:-表示删除的内容,+表示新增的内容,帮助我们确认修改是否正确,避免提交错误代码。
步骤 2:提交修改(git add + git commit)
确认修改无误后,提交到版本库:
命令:
plaintext
# 添加修改后的文件到暂存区
PS C:\Users\Desktop\learn_git> git add readme.txt
# 提交修改
PS C:\Users\Desktop\learn_git> git commit -m 'wrote a readme file'
[master a253f5a] wrote a readme file
1 file changed, 2 insertions(+)
关键变化:
- 没有
create mode信息:因为readme.txt已存在,这次是 "修改" 而非 "新建",所以 Git 只显示变更行数。 - 新的哈希值
a253f5a:即使修改的是同一个文件,只要内容或提交时间有变化,哈希值就会不同(Git 哈希值由提交内容、作者、时间、父提交哈希等信息计算得出,确保每个版本唯一)。
🏃4. 多文件批量管理:一次性提交多个新增文件
实际项目中常需要同时新增多个文件(比如 file1.txt、file2.txt、file3.txt),可批量添加并提交。
命令:
plaintext
# 分别添加3个文件到暂存区(也可直接用 git add . 批量添加)
PS C:\Users\Desktop\learn_git> git add file1.txt
PS C:\Users\Desktop\learn_git> git add file2.txt
PS C:\Users\Desktop\learn_git> git add file3.txt
# 或者 PS C:\Users\Desktop\learn_git> git add file1.txt file2.txt file3.txt
# 一次性提交3个文件
PS C:\Users\Desktop\learn_git> git commit -m 'add 3 file.'
[master e88ce65] add 3 file.
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1.txt
create mode 100644 file2.txt
create mode 100644 file3.txt
注意事项:
git add .会添加当前目录下所有未跟踪 / 修改的文件,适合批量操作,但要提前通过git status确认,避免误加日志、缓存等无关文件(可通过.gitignore文件排除不需要跟踪的文件)。
🏃5. 版本回退:回到历史版本
当代码出现问题(比如提交了错误内容),需要回退到之前的稳定版本时,可通过 git reset 实现。
步骤 1:查看版本历史(git log)
先通过 git log 或 git log --oneline 查看所有版本的哈希值和提交说明:
命令:
plaintext
# 简洁查看版本历史(--oneline 表示一行显示一个版本)
PS C:\Users\Desktop\learn_git> git log --oneline
6376260 (HEAD -> master) append GPL # 当前版本
b1cb682 add distributed
e88ce65 add 3 file.
a253f5a wrote a readme file
ae97af2 wrote a readme file
说明:
HEAD -> master:表示当前处于master分支的6376260版本。- 若
git log进入分页模式,按q键退出。
步骤 2:回退到指定版本(git reset --hard)
比如要回退到 "add distributed" 版本(哈希值 b1cb682):
命令:
plaintext
# 回退到上一个版本(HEAD^ 表示当前版本的上一个版本,^ 越多回退越远)
PS C:\Users\Desktop\learn_git> git reset --hard HEAD^
HEAD is now at b1cb682 add distributed
# 也可直接通过哈希值回退到任意版本(比如回退到最早的"add 3 file."版本)
PS C:\Users\Desktop\learn_git> git reset --hard e88ce65
HEAD is now at e88ce65 add 3 file.
关键提醒:
git reset --hard是 "硬回退",会直接覆盖工作区的文件,若有未提交的修改会丢失,使用前务必确认已保存重要内容。- 若回退后想恢复到新版本,可通过
git reflog查看所有操作记录,找到新版本的哈希值再回退:
plaintext
PS C:\Users\Desktop\learn_git> git reflog
6376260 (HEAD -> master) HEAD@{0}: reset: moving to 6376260
a253f5a HEAD@{1}: reset: moving to HEAD^
# 找到目标版本的哈希值 6376260,执行 git reset --hard 6376260 即可恢复
🏃6. 文件撤销:丢弃不需要的修改
若修改了文件但不想提交(比如误改了内容),可通过 git checkout -- <文件名> 丢弃工作区的修改,恢复到最近一次提交的状态。
命令:
plaintext
# 假设修改了 readme.txt 但不想保留,执行以下命令撤销
PS C:\Users\Desktop\learn_git> git checkout -- readme.txt
注意事项:
- 命令中的
--不可省略,否则 Git 会误以为你要切换分支。 - 若文件已加入暂存区(执行过
git add),需先通过git reset HEAD <文件名>撤销暂存,再执行git checkout:
plaintext
# 撤销暂存区的修改
PS C:\Users\Desktop\learn_git> git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
# 再丢弃工作区的修改
PS C:\Users\Desktop\learn_git> git checkout -- readme.txt
🏃7. 文件删除:从版本库中移除文件
若需要删除项目中的文件(比如无用的 file1.txt),需同时删除工作区文件和版本库记录,避免 Git 提示 "文件缺失"。
场景 1:彻底删除文件(工作区 + 版本库同时移除)
如果文件确实无用,需要从项目中完全删除(包括本地文件和版本库记录):
-
删除文件并同步到版本库 使用
git rm命令,一次性删除工作区文件并将 "删除操作" 加入暂存区:bashgit rm <文件名> # 例如:git rm file1.txt -
提交删除记录到版本库 执行
git commit确认删除,版本库会记录这次删除操作:bashgit commit -m "删除无用的file1.txt"效果:工作区的文件被删除,版本库中该文件的历史记录保留,但当前版本不再包含该文件。
场景 2:仅从版本库移除,保留工作区文件(取消跟踪)
如果文件需要留在本地(如配置文件),但不想让 Git 继续跟踪它(从版本库中 "移除跟踪"):
-
取消版本库跟踪,但保留本地文件 使用
git rm --cached命令,仅从版本库和暂存区移除,工作区文件不变:bashgit rm --cached <文件名> # 例如:git rm --cached file1.txt -
提交变更到版本库确认取消跟踪的操作:
bashgit commit -m "停止跟踪config.ini(本地保留)"后续建议 :将该文件加入
.gitignore,避免后续误操作重新添加到版本库:bashecho "config.ini" >> .gitignore # 新增到忽略列表
这两个场景执行下又想回到原先的一步可以常考上面的几个步骤
说明:
git rm本质是 "删除文件 +git add(提交删除操作到暂存区)" 的组合命令,一步到位。- 执行后可通过
git status查看状态:删除操作会显示在Changes to be committed中,确认后提交即可。 - 若删除后想恢复,可通过版本回退(
git reset --hard <版本号>)找回历史版本中的文件(前提是该文件曾被提交过)。
三、总结:Git 日常工作流核心公式
通过以上实战,可总结出 Git 版本管理的核心流程,适用于 90% 以上的日常开发场景:
- 新增 / 修改文件:在工作区编辑代码。
- 确认差异 :
git diff <文件名>检查修改内容。 - 暂存文件 :
git add <文件名>或git add .将文件加入暂存区。 - 提交版本 :
git commit -m "清晰的提交说明"写入版本库(提交说明要简洁明了,比如 "修复登录按钮点击无响应问题",方便后续追溯)。 - 版本管理 :通过
git log查看历史、git reset回退版本、git checkout --撤销修改。
掌握这些基础操作,就能应对大部分个人项目和团队协作中的版本管理需求。后续可进一步学习分支管理、远程仓库(GitHub/Gitee)协作等进阶内容,让 Git 真正成为开发效率的 "助推器"。