概述
Git与其他版本控制系统的本质区别在于 ------Git跟踪并管理的单元是修改(增/删/改/重命名)而非整个文件
验证
-
第一次修改并添加 ------
readme.txt加一行内容,通过git add添加sh$ git add readme.txtsh$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.txt -
第二次修改但不添加 ------
readme.txt加一行内容,但是不通过git add添加 -
提交修改 ------ 通过
git commit提交修改。通过输出信息可知,第二次修改没被提交sh$ git commit -m "git tracks changes" [master 519219b] git tracks changes 1 file changed, 1 insertion(+)sh$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
-
流程 ------ 第一次修改 ->
git add-> 第二次修改 ->git commit -
原因 ------ 因为在工作区的第二次修改并没有放入暂存区 ,所以
git commit只负责把暂存区的第一次修改提交。这说明,一次提交的是放入暂存区的修改 ,而不是整个
readme.txt文件
指令介绍
恢复文件、切换分支 git checkout
-
两种主要模式
主要模式 语法 用途 特点 切换分支 git checkout <分支>切换工作分支 更新工作目录,改变 HEAD指向恢复文件 git checkout <提交> <文件>恢复文件到历史版本 不改变 HEAD,仅替换文件内容 -
文件恢复 ------ 丢弃工作区未暂存的修改、从历史提交或其他分支恢复文件
-
从历史提交恢复文件
shgit checkout <commit> -- <file> # 恢复文件到指定版本shgit checkout main -- README.md # 示例:从 main 恢复文件 -
从索引恢复文件(撤销工作区修改)
shgit checkout -- <file> # 撤销工作区的修改(未暂存) git checkout HEAD -- <file> # 同上,显式指定 HEAD -
处理合并冲突
shgit checkout --ours <file> # 使用当前分支版本解决冲突 git checkout --theirs <file> # 使用合并分支版本解决冲突 git checkout -m <file> # 恢复原始冲突标记 git checkout -f <file> # 强制覆盖未合并的文件
-
-
分支管理
-
切换分支
shgit checkout [<branch>] # 切换到<branch>分支 -
创建分支
shgit checkout -b <new-branch> [<start-point>] # 创建新分支(分支不存在时报错) git checkout -B <branch> [<start-point>] # 强制创建/重置分支(分支存在则重置) -
分离
HEAD模式shgit checkout --detach [<branch>] # 分离 HEAD 到分支尖端 git checkout <commit> # 分离 HEAD 到指定提交
-
版本回退 git reset
-
语法
shgit reset [<mode>] [<commit>]参数 modeHEAD移动暂存区 工作区 适用场景 --soft✅ 回退 ❌ 保持不变 ❌ 保持不变 回退 HEAD为<commit>--mixed(默认)✅ 回退 ✅ 重置(撤销 git add)❌ 保持不变 撤销暂存区 --hard✅ 回退 ✅ 重置 ✅ 完全回退 撤销暂存区和工作区 
专用恢复文件 git restore
-
功能 ------
Git 2.23引入的 文件状态恢复命令 ,用于精准撤销工作区或暂存区的修改,替代部分git checkout和git reset功能- 撤销工作区修改 --- 即丢弃未暂存的更改
- 撤销暂存区修改 --- 即取消
git add - 从历史提交恢复文件 --- 即覆盖工作区/暂存区
-
语法
shgit restore [<options>] [--source=<branch>] <file>...参数 说明 -s <commit>/--source=<commit>指定从哪个版本恢复(默认:暂存区或 HEAD)-S/--staged暂存区中撤销文件的修改,但不影响工作区 -W/--worktree工作区中撤销文件的修改 - 把暂存区 的内容恢复到工作区 - 如果文件不在暂存区,则恢复到最新提交状态 -SW/--staged --worktree同时恢复暂存区和工作区(覆盖所有修改) -
具体示例
-
参数
--staged------ 从最新提交恢复到暂存区shgit add readme.txt # 1、添加文件到暂存区 git restore --staged readme.txt # 2、从暂存区移除(取消暂存) # 此时 readme.txt 的修改 # - 在工作区还在 # - 但不在暂存区(需要重新 git add)
-
参数
--worktreesh# 1、修改 readme.txt(未暂存) git restore --worktree readme.txt # 2、从暂存区恢复到工作区 # 此时 readme.txt 的修改已完全被撤销
-
撤销修改
相关指令
git checkout------ 切换分支/恢复文件git restore------ 精准撤销工作区或暂存区的修改(Git 2.23+推荐,专用于文件恢复)git reset------ 移动HEAD或重置暂存区/工作区(功能更通用)
场景一:仅工作区修改,未add,需撤销修改
-
初始状态 ------ 假设
readme.txt在版本库中的最新提交(HEAD)内容为:txtHello, Git!工作区 :
Hello, Git!(和HEAD一致)暂存区 :
Hello, Git!(和HEAD一致) -
修改文件但不添加 ------ 修改工作区的文件内容,但是未添加未添加
txtHello, Git! This is a new line.工作区 :
Hello, Git! This is a new line.(已修改)暂存区 :
Hello, Git!(未git add,暂存区未更新)HEAD :
Hello, Git!(未git commit,版本库未变化) -
撤销修改 ------ 输入命令
git checkout或git restore,拉取暂存区的修改,恢复到之前的状态shgit checkout -- readme.txt 或 git restore readme.txt # 缺省用 --source=HEAD 和 --worktree- 检查状态 ------
readme.txt在工作区有修改,但未暂存(即暂存区的内容和HEAD一致) - 恢复策略 ------ 因为修改未暂存,所以用
HEAD指向的当前版本 (最近一次提交的内容HEAD)覆盖工作区
工作区 :被还原为
Hello, Git!暂存区 :
Hello, Git!HEAD :
Hello, Git!
注意 :git checkout -- file命令中--很重要。没有--,就变成切换到另一个分支 命令,后续分支管理会再次使用它 - 检查状态 ------

场景二:已 add,未 commit,需撤销修改
-
初始状态 ------ 假设
readme.txt在版本库中的(HEAD)内容为:Hello, Git!工作区 :
Hello, Git!(和HEAD一致)暂存区 :
Hello, Git!(和HEAD一致) -
修改并添加到暂存区
- 修改工作区的文件内容:
Hello, Git! This is a new line. - 添加到暂存区:
git add readme.txt
工作区 :
Hello, Git! This is a new line.(已修改)暂存区 :
Hello, Git! This is a new line.(已暂存)HEAD :
Hello, Git!(未提交git commit,版本库未变化) - 修改工作区的文件内容:
-
撤销暂存区修改 ------ 输入命令
git reset,将暂存区的内容撤销(unstage)为HEAD的状态shgit reset HEAD readme.txt工作区 :
Hello, Git! This is a new line.(修改仍在)暂存区 :恢复为
Hello, Git!(和HEAD一致)HEAD :
Hello, Git! -
撤销工作区修改 ------ 输入命令
git checkout,丢弃工作区修改(即场景一情况)shgit checkout -- readme.txt工作区 :被还原为
Hello, Git!(和HEAD一致)暂存区 :仍为
Hello, Git!HEAD : 仍为
Hello, Git!

场景三:已 add,已 commit,需撤销修改
-
初始状态 ------ 假设
readme.txt在版本库中的最新提交(HEAD)内容为:shHello, Git!工作区 :
Hello, Git!(和HEAD一致)暂存区 :
Hello, Git!(和HEAD一致) -
修改、添加、提交文件
- 修改工作区的文件内容:
Hello, Git! This is a new line. - 添加到暂存区:
git add readme.txt - 提交到
HEAD:git commit -m "add new line"
工作区 :
Hello, Git! This is a new line.(最新提交)暂存区 :
Hello, Git! This is a new line.(与HEAD一致)HEAD :
Hello, Git! This is a new line.(与HEAD一致) - 修改工作区的文件内容:
-
撤销修改 ------ 输入命令
git reset --hard指令,将当前分支回退到上一个提交,并强制更新工作区和暂存区shgit reset --hard HEAD^- 重置
HEAD:将HEAD指针指向上一次提交HEAD^(即Hello, Git!)- 覆盖暂存区和工作区:
--hard强制将 暂存区 和 工作区 的内容回退到HEAD^的状态
- 覆盖暂存区和工作区:
工作区 :
Hello, Git!(强制回退)暂存区 :
Hello, Git!(强制回退)HEAD :
Hello, Git!(指针指向上一次提交)
注意:该操作强制回退所有文件(包括提交、暂存区和工作区)到上一个版本- 对于已提交的修改,可以通过
reflog恢复 - 对于未提交的修改(在暂存区和工作区的修改),将永久丢失

- 重置
删除文件
相关指令
git rm------ 在工作区删除文件,并提交删除操作到暂存区,以便下一次提交时在分支生效git checkout------ 恢复文件
场景一:工作区中删除文件
-
删除工作区文件 ------ 运行命令
rm删除工作区的文件shrm test.txt
场景二:版本库中删除文件
-
删除暂存区文件 ------ 运行命令
git rm删除工作区和暂存区的文件shgit rm test.txt -
删除版本库文件 ------ 运行命令
git commit提交修改到分支上shgit commit -m "remove test.txt"
场景三:误删恢复文件
-
恢复文件 ------ 误删文件,恢复到最新版本
shgit checkout -- test.txtgit checkout其实是用版本库里的版本替换工作区的版本,所以无论工作区是修改还是删除都可一键还原