概述
基本概念
- 提交
Commit- 每次提交保存一个文件快照(版本),包含修改内容、作者、时间、提交信息等
- 每次提交有唯一的
Commit ID(SHA-1哈希值,如1094adb...),用于标识版本
HEAD指针- 指向当前所在的版本(即最新提交),相当于当前工作目录的状态
- 移动
HEAD指针可切换不同版本(如回退或前进)
- 分支
Branch- 分支的本质是指向某个提交的可移动指针 (如
master分支) - 默认分支通常是
master或main,用户可创建其他分支实现并行开发、团队共同开发
- 分支的本质是指向某个提交的可移动指针 (如
特点
- 快照存储 ------
Git保存文件快照而非差异,切换版本时直接还原快照,速度快 - 指针操作 ------ 版本切换的本质是移动
HEAD指针,而不是进行文件复制 - 数据安全 ------ 即使回退,由于回退前的提交仍存于
.git中,并未被删除,因此可通过reflog找回
指令介绍
版本控制的核心指令是
git reset,本质上是撤销更改和移动HEAD指针
sh
git reset [-mode] [-commit]
模式 mode |
HEAD 移动 |
暂存区 | 工作区 | 适用场景 |
|---|---|---|---|---|
--soft |
✅ 回退 | ❌ 保持不变 | ❌ 保持不变 | 修改提交历史 |
--mixed(默认) |
✅ 回退 | ✅ 重置(撤销 git add) |
❌ 保持不变 | 撤销暂存区修改,重新组织提交 |
--hard |
✅ 回退 | ✅ 重置 | ✅ 完全回退 | 彻底丢弃包括工作区在内的所有更改 |

版本回退
相关指令
git reset------ 撤销更改和移动HEAD指针git log------ 按时间倒序排列显示当前分支的提交记录
实操:回退到上个版本
-
假设当前用户已进行三次提交
git commit操作,提交哈希值Commit id和附带信息如下:提交序号 提交哈希值 附带信息 1eaadf4e35...wrote a readme file2e475afc93...add distributed3(最新一次,由HEAD指针指向)1094adb7...append GPL
-
回退上个版本 ------ 输入命令
git reset --hard HEAD^回退到上一个版本add distributedsh$ git reset --hard HEAD^ HEAD is now at e475afc add distributed
-
参数含义
-
^符号表示法 ------HEAD^后面的^符号表示向上追溯一个父提交 ,每增加一个^就向上移动一个版本 -
~符号表示法 ------HEAD~后面的~符号可以视为缩写 方式,通常在~后加数字,表示追溯到第几个版本 -
二者区别
^主要用于合并提交(有多个父提交的情况),如HEAD^1= 第一个父提交HEAD^2= 第二个父提交(通常是合并进来的分支)
~永远沿第一个父提交向上追溯
sh# 回到上一个版本 git reset --hard HEAD^ git reset --hard HEAD~ # 回到上两个版本 git reset --hard HEAD^^ git reset --hard HEAD~2 # 等价写法 # 回到上五个版本 git reset --hard HEAD^^^^^ git reset --hard HEAD~5 # 更简洁的写法 -
实操:回退到指定版本
-
查找版本号 ------ 输入命令
git log查找需要回退的指定版本的Commit id,指令列出已提交的版本和Commit id值sh$ git log --pretty=oneline 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL e475afc93c209a690c39c13a46716e8fa000c366 add distributed eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote readme file ... -
回退指定版本 ------ 输入命令
git reset --hard commit_id回退到该版本sh$ git reset --hard eaadf4 HEAD is now at eaadf4 append GPL技巧 :在指令中,回退的
Commit id值没必要写全,只写前几位,能够区分其他版本即可
-
查看情况 ------ 输入命令
git log再查看提交情况bash$ git log --pretty=oneline eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file ... ...
版本恢复
版本恢复的关键在于如何查找需要恢复的
Commit id如果命令行尚未关闭还可以向上翻找,如果命令行关闭则需要使用
git reflog进行查询
相关指令
git reset------ 撤销更改和移动HEAD指针git reflog------ 记录本地仓库中HEAD和分支引用的变更历史,用于查看命令历史
实操:回退某版本 + 命令行未关闭
-
往上查找 ------ 命令行往上查找之前版本的
Commit id -
回退该版本号 ------ 输入命令
git reset --hard commit_id回退到该版本sh$ git reset --hard 1094a HEAD is now at 83b0afe append GPL
实操:回退某版本 + 命令行已关闭
-
查找之前的版本 ------ 输入命令
git reflog查找Commit idsh$ git reflog e475afc HEAD@{1}: reset: moving to HEAD^ 1094adb (HEAD -> master) HEAD@{2}: commit: append GPL e475afc HEAD@{3}: commit: add distributed eaadf4e HEAD@{4}: commit (initial): wrote a readme file -
回退该版本号 ------ 输入命令
git reset --hard commit_id回退到该版本sh$ git reset --hard 1094a HEAD is now at 83b0afe append GPL