第三章 Git基础操作:单人开发必备核心命令详解
版本控制的核心,始终围绕着“仓库”进行一系列操作。在启动一个新项目时,第一步就是让Git接管并对其进行管理。
创建仓库与首次提交操作指南
首先介绍第一种方式:初始化本地仓库。这就像在一片空地上打下地基,Git会在项目目录下创建一个隐藏的.git目录,用于记录和追踪今后所有的版本变化。

命令非常直观:先创建目录,进入目录,然后执行git init。通过git status可以随时查看当前状态——一个尚未有任何提交记录的新仓库,会显示“No commits yet”以及一堆未跟踪的文件。
另一种方式是克隆远程仓库,这一点将在后续协作章节中详细展开。简单来说,使用git clone 仓库地址就能把远程的完整项目及其历史记录全部复制到本地。
有了仓库,如何将代码纳入版本管理呢?以简单的Python项目为例:创建README.md和hello.py文件后,通过git status可以看到它们显示为红色,表示“未跟踪”状态。此时使用git add命令将它们添加到暂存区,状态就会变为绿色。最后执行git commit -m "Initial commit: add README and hello.py",就完成了第一次提交。提交时务必编写有意义的说明信息,这在日后回溯历史时将大有帮助。
使用git log查看,会得到类似这样的输出:
commit 3a7c8f9d2e1b4c5a6d7e8f9a0b1c2d3e4f5a6b7c (HEAD -> master)
Author: Your Name
每个commit都有一个唯一的哈希值,这相当于Git世界中的身份标识。
文件的三种状态转换详解
Git有一个基础概念:文件在任一时刻都处于“已修改”、“已暂存”或“已提交”三种状态之一。理解这三者之间的转换,就等于掌握了Git的核心操作。
git add让文件从“已修改”变为“已暂存”,相当于告诉Git“这些改动我要记录下来”。而git commit则将暂存区的所有改动正式写入仓库历史。如果想偷懒,可以直接使用git commit -a -m "message",跳过暂存步骤,直接提交所有已跟踪文件的修改。
反向操作同样常用:git reset HEAD 或新版git restore --staged 可以将暂存区的文件“撤出”,但保留工作区的修改。而git checkout -- 或新版git restore 则会彻底放弃工作区的修改——此操作不可恢复,需格外谨慎。
git status 深度解析
这是一个每天要敲几十次的命令,但其输出信息远比想象中丰富。一个典型的输出示例如下:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged
它不仅告诉你当前处于哪个分支、是否与远程分支同步,还清晰列出了三种状态的文件:已暂存待提交的、已修改但未暂存的、以及完全未跟踪的新文件。每个区块下方还附有提示命令,新手照着输入即可完成对应操作。
git diff —— 查看文件修改细节
想知道具体修改了哪几行代码?git diff是你日常运维中不可或缺的命令。该命令其实有多个常用变种:
git diff比较的是工作区与暂存区的差异,即已经修改但尚未执行git add的内容。
git diff --staged(或--cached)比较的是暂存区与最新提交的差异,也就是即将提交的内容。
git diff HEAD则直接对比工作区与最新提交的差异。
更精细的操作:例如,只查看hello.py文件在两个版本前的改动,可使用git diff HEAD~2 -- hello.py。输出会清晰显示增加和删除的行,示例如下:
diff --git a/hello.py b/hello.py
index 7c6a5b8..7f3e9c1 100644
--- a/hello.py
+++ b/hello.py
@@ -1,2 +1,3 @@
print('Hello World')
+print('Welcome to Git')
多出的+号行,表示新增的内容。在处理复杂项目时,还可以使用git difftool调用图形化对比工具,视觉效果更直观。
git log —— 查看项目历史记录
git log是整个项目的历史档案。最基本的用法是直接输入,按时间倒序列出所有提交。但在实际工作中,很少会查看完整输出,几个常用参数会更加实用:
只显示一行摘要:git log --oneline
可视化分支结构:git log --graph --oneline --decorate --all
查看最近5条记录:git log -5
按作者筛选:git log --author="Your Name"
按提交信息搜索:git log --grep="fix bug"
查看某个文件的历史变迁:git log --follow hello.py
自定义输出格式,例如git log --pretty=format:"%h - %an, %ar : %s",可显示简写哈希值、作者名、相对时间和提交信息,信息密度很高。
撤销与回退操作 —— Git中的“后悔药”
Git之所以强大,很大程度上归功于其提供的丰富“反悔”机制。记住以下几种最常见的场景就足够了。
场景一:提交后发现漏了文件或写错了提交说明。无需慌张,可以使用git add forgotten_file将漏掉的文件加入暂存区,然后执行git commit --amend --no-edit,即可在保留原有提交信息的情况下,将新文件追加上去。如果需要修改提交信息,则使用git commit --amend -m "新的提交信息"。
场景二:希望回到某个历史版本。首先使用git log --oneline找到目标commit的哈希值,然后根据需求选择合适的模式:
--soft:仅移动HEAD,暂存区和工作区的修改都保留,仿佛什么都没发生。--mixed(默认):保留工作区修改,但清空暂存区,文件回到已修改状态。--hard:最彻底的方式,直接丢弃后续所有修改(不可恢复,请谨慎使用!)。
例如,想回退到前两个提交:git reset --hard HEAD~2。
场景三:文件已经git add了,但想反悔。可以使用git reset HEAD 或新版git restore --staged 。
场景四:工作区修改了一部分,想还原到原始状态。使用git checkout -- 或新版git restore 。
场景五:不小心删除了一个提交或分支,但尚未彻底丢失。Git提供了一个“万能后悔药”——git reflog,它会记录你所有HEAD移动的历史。找到对应的哈希值,然后执行git checkout 即可回到那个状态,或者使用git branch recover-branch 创建一个新分支指向那个commit。
掌握了这些基础操作,单人开发中的绝大部分场景就能轻松应对了。
