跳到主要内容

06 git reset 回退版本

git reset 回退版本

git reset 命令用于将文件回退到某个历史版本。

三种回退模式

回退选项工作区暂存区版本库
--soft保持不变保持不变HEAD 指向历史版本
--mixed(默认)保持不变清空HEAD 指向历史版本
--hard清空并用历史版本覆盖清空并用历史版本覆盖HEAD 指向历史版本

示例

# 1. 重置到指定提交,但保留工作区和暂存区的更改(仅移动 HEAD)
git reset --soft <commit_id>
# 示例: 回退到前一个提交,但保留暂存区和工作区中的所有修改
git reset --soft HEAD~1

# 2. 重置到指定提交,清除暂存区的更改,但保留工作区的修改
git reset --mixed <commit_id>
# 示例: 取消最近一次提交,保留工作区中的代码更改,但暂存区已被清空
git reset --mixed HEAD~1

# 3. 重置到指定提交,并丢弃所有未提交的更改(慎用)
git reset --hard <commit_id>
# 示例: 完全回退到上一个提交,删除所有工作区和暂存区的修改
git reset --hard HEAD~1

# 4. 取消某个文件的暂存状态,但保留文件内容不变
git reset HEAD <file>
# 示例: 取消暂存 main.py,但文件内容保持不变
git reset HEAD main.py

# 5. 丢弃对某个文件的所有本地更改(谨慎使用)
git checkout -- <file>
# 示例: 将 main.py 恢复到最后一次提交的状态,丢弃所有未提交的修改
git checkout -- main.py

# 6. 撤销最近一次的提交,但保留更改并重新提交
git reset --soft HEAD~1
git commit -m "新的提交信息"
# 示例: 撤销最近一次提交,保留文件修改并重新提交
git reset --soft HEAD~1
git commit -m "新的提交信息"

# 7. 重置远程分支(强制同步,谨慎使用)
git reset --hard origin/main
git pull origin main --force
# 示例: 强制同步本地分支与远程分支,丢弃所有本地未推送的更改
git reset --hard origin/main
git pull origin main --force

补充内容

1.HEAD 概念

在 Git 中,HEAD当前分支的最新提交的指针,可以理解为Git当前所在的“位置”或“快照”。

2.git log 查看提交历史

testgit git:(master) git --no-pager log --oneline a280d92 (HEAD -> master) 第三次提交 b25cfec 第二次提交 2ea7240 第一次提交
Details

# 1. 基本日志输出
git log # 默认分页显示详细提交信息
git --no-pager log # 直接输出,不进入分页模式

# 2. 简洁模式
git log --oneline # 简短格式:哈希 + 提交信息
git log --pretty=short # 显示作者 + 简短提交信息

# 3. 图形化显示
git log --graph # 以 ASCII 方式绘制分支合并图
git log --oneline --graph --all # 简洁图形化显示所有分支提交

# 4. 详细模式
git log --stat # 显示修改的文件及行数变更
git log -p # 显示具体代码改动(类似 git diff)
git log --name-only # 仅显示修改的文件名
git log --name-status # 显示文件状态(A = 新增,M = 修改,D = 删除)

# 5. 过滤提交
git log -n 5 # 显示最近 5 条提交
git log --since="2024-01-01" --until="2024-03-01" # 按时间范围筛选
git log --author="Alice" # 只显示 Alice 的提交
git log --grep="bugfix" # 只显示提交信息包含 "bugfix" 的提交

# 6. 按文件查看提交
git log -- src/main.py # 只查看 src/main.py 的提交记录
git log -p -- src/main.py # 查看 src/main.py 的具体变更

# 7. 自定义格式
git log --pretty=format:"%h - %an, %ar : %s" # 自定义格式
git log --pretty=format:"%H%n%an%n%ad%n%s%n%b%n" # 详细格式(适合脚本处理)