第三章 Git 基础操作 —— 单人开发的核心命令
3.1 创建仓库与首次提交
方式一:初始化本地仓库
# 创建项目目录
mkdir my_project
cd my_project
# 初始化 Git 仓库(生成 .git 隐藏目录)
git init
# 查看状态(应该看到 "No commits yet" 和 untracked files)
git status
方式二:克隆远程仓库(后面详解)
git clone https://github.com/某个仓库.git
创建第一个文件并提交:
# 创建文件
echo "# My Project" > README.md
echo "print('Hello World')" > hello.py
# 查看状态(红色表示未跟踪)
git status
# 将文件添加到暂存区
git add README.md hello.py
# 或者添加所有变更:git add .
# 再次查看状态(绿色表示已暂存)
git status
# 提交到仓库(必须写有意义的提交信息)
git commit -m "Initial commit: add README and hello.py"
# 查看提交历史
git log
输出示例:
commit 3a7c8f9d2e1b4c5a6d7e8f9a0b1c2d3e4f5a6b7c (HEAD -> master)
Author: Your Name <email@example.com>
Date: Fri May 30 14:23:45 2026 +0800
Initial commit: add README and hello.py
3.2 文件的三种状态转换
# 已修改 -> 已暂存
git add <file>
# 已暂存 -> 已提交
git commit -m "message"
# 跳过暂存区直接提交(只适用于已跟踪的文件)
git commit -a -m "message"
# 移除暂存区的文件(保留工作区修改)
git reset HEAD <file>
# 丢弃工作区的修改(危险!不可恢复)
git checkout -- <file>
# 或新版本推荐
git restore <file>
# 从暂存区撤回到工作区(不保留暂存)
git reset HEAD <file>
# 或
git restore --staged <file>
3.3 git status 深入解析
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed: # 已暂存
(use "git restore --staged <file>..." to unstage)
modified: index.html
new file: style.css
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.md
Untracked files: # 未跟踪的新文件
(use "git add <file>..." to include in what will be committed)
temp.log
3.4 git diff —— 查看修改细节
# 查看工作区与暂存区的差异(即未暂存的修改)
git diff
# 查看暂存区与最新提交的差异(即即将提交的内容)
git diff --staged
# 或
git diff --cached
# 查看工作区与最新提交的差异
git diff HEAD
# 查看两次提交之间的差异
git diff <commit1> <commit2>
# 查看单个文件在不同版本的差异
git diff HEAD~2 -- hello.py
# 使用图形化工具查看差异
git difftool
示例输出:
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')
3.5 git log —— 查看历史
# 完整日志
git log
# 一行显示(简洁)
git log --oneline
# 图形化显示分支
git log --graph --oneline --decorate --all
# 显示最近 n 条
git log -5
# 显示每次修改的具体内容
git log -p
# 按作者搜索
git log --author="Your Name"
# 按提交信息搜索
git log --grep="fix bug"
# 显示文件修改统计
git log --stat
# 查看某个文件的历史
git log --follow hello.py
# 自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
# %h 缩写哈希, %an 作者名, %ar 相对时间, %s 提交信息
3.6 撤销与回退 —— “后悔药”
场景1:修改最后一次提交(追加文件或修改信息)
# 忘记添加某个文件,或者提交信息写错了
git add forgotten_file
git commit --amend --no-edit # 不修改提交信息,只是追加文件
# 修改最后一次提交的信息
git commit --amend -m "新的提交信息"
场景2:回退到某个历史版本
# 查看历史找到目标提交的哈希
git log --oneline
# 回退到指定提交(保留之后修改在工作区)
git reset --soft <commit> # 保留暂存区和工作区
git reset --mixed <commit> # 保留工作区,清空暂存区(默认)
git reset --hard <commit> # 彻底删除之后的所有修改(危险!)
# 示例:回退到前 2 个提交
git reset --hard HEAD~2
场景3:撤销已暂存的文件
git reset HEAD <file>
# 新版本推荐
git restore --staged <file>
场景4:撤销工作区的修改
git checkout -- <file>
# 新版本推荐
git restore <file>
场景5:恢复已删除的提交或分支(使用 reflog)
# 查看所有 HEAD 移动记录
git reflog
# 找到目标哈希,然后恢复
git checkout <hash>
# 或者创建新分支指向它
git branch recover-branch <hash>