git reset:重置分支的历史与工作区
 
核心作用:移动当前分支的指针(即改变分支的历史),并可选地修改暂存区(Index)和工作目录(Working Directory)。常用于撤销提交或合并操作。
三种模式
-  
--soft模式
行为:仅移动分支指针(HEAD),不修改暂存区和工作目录。
使用场景:撤销提交但保留修改,允许重新提交。git reset --soft HEAD~1 # 撤销最后一次提交,修改保留在暂存区 - 
--mixed模式(默认)
行为:移动分支指针,并重置暂存区,但保留工作目录的修改。
使用场景:撤销提交和暂存操作,需重新add后再提交git reset HEAD~1 # 等效于 git reset --mixed HEAD~1 - 
--hard模式
行为:移动分支指针,并强制重置暂存区和工作目录到指定提交的状态。
使用场景:彻底丢弃最近的提交和所有修改(慎用!)。git reset --hard HEAD~1 # 丢弃最后一次提交及所有修改关键特点
影响分支历史:reset会改变分支的指针,从而修改提交历史。
适用场景:撤销本地提交、合并冲突后重置等操作。 
git checkout:切换分支或检出内容
 
核心作用:切换分支,或检出指定提交/文件到工作目录。不修改分支历史,主要用于切换上下文或恢复文件。
切换分支
git checkout <branch-name>  # 切换到另一个分支 
- 行为: 
- 移动 HEAD 到目标分支,更新工作目录和暂存区为该分支的最新状态。
 - 如果工作目录有未提交的修改,Git 会阻止切换(除非使用 
-f强制切换或修改被忽略)。 
 
分离头指针(Detached HEAD)
git checkout <commit-hash>  # 检出一个提交,进入分离头状态 
- 行为: 
- HEAD 直接指向提交而非分支,此时的新提交不会属于任何分支(需手动创建分支保存)。
 - 适用于临时调试或实验性修改。
 
 
检出文件
git checkout HEAD -- file.txt  # 从 HEAD 恢复文件到工作目录和暂存区
git checkout <branch> -- file.txt  # 从其他分支恢复文件 
- 行为: 
- 将指定文件恢复到目标版本(覆盖工作目录和暂存区),不影响 HEAD 位置。
 - 常用于撤销对单个文件的修改。
 
 
关键特点
- 不修改分支历史:
checkout仅切换上下文或恢复文件,不会改变分支的提交记录。 - 适用场景:切换分支、临时查看旧版本代码、撤销文件修改。
 
reset 与 checkout 的核心区别
 
| 功能 | git reset | git checkout | 
|---|---|---|
| 操作对象 | 当前分支(修改分支指针) | 分支、提交或文件(不修改分支历史) | 
| 影响范围 | 分支历史、暂存区、工作目录 | 工作目录、暂存区(仅文件操作时) | 
| 是否改变提交历史 | 是 | 否(除非在分离头模式下提交) | 
| 典型场景 | 撤销本地提交 | 切换分支、恢复文件 | 
总结
- 用 
reset当你想撤销提交或修改分支历史(如回退到旧版本)。 - 用 
checkout当你想切换分支、查看旧版本代码,或恢复单个文件。 
慎用 git reset --hard:它会永久丢弃未提交的修改!
场景:需要将工作目录的修改与上一个提交完全合并为一个新提交,并可能修改提交信息,怎么做呢?
以下是分步解决方案,可根据你的需求选择两种方法:
git reset --soft 和 git commit --amend 都是对本地提交历史的修改。如果这些提交已经推送到远程仓库(如 GitHub、GitLab),直接修改本地历史后,再推送会遇到问题。如果提交已推送到远程仓库需要告知团队成员
方法一:使用 git reset --soft
适用场景:需要将工作目录的修改与上一个提交完全合并为一个新提交,并可能修改提交信息。
步骤:
- 撤销最近一次提交,但保留修改在暂存区
 
git reset --soft HEAD~1 
此时,之前的提交内容和工作目录的新修改都会保留在暂存区(git status 会显示所有修改已暂存)。
- 查看状态确认修改已合并
 
git status  # 确认所有修改已加入暂存区 
- 提交合并后的内容
 
git commit -m "合并工作区修改与上一个提交" 
方法二:使用 git commit --amend 
适用场景:仅需将工作目录的修改追加到上一个提交,且不修改提交信息(或微调)。
步骤:
- 将工作目录的修改加入暂存区:
 
git add .  # 或指定文件 git add file1.txt 
- 将修改合并到上一个提交:
 
git commit --amend --no-edit  # 保留原提交信息 
 如果想修改提交信息,去掉 --no-edit
git commit --amend -m "新的提交信息" 
| 方法 | git reset --soft | git commit --amend | 
|---|---|---|
| 是否修改提交历史 | 是(生成新提交) | 是(覆盖原提交) | 
| 是否保留原提交信息 | 需手动输入新提交信息 | 可保留或修改原提交信息 | 
| 适用场景 | 完全重写提交内容与信息 | 快速追加修改到原提交 |