git checkout
获取某次提交中的部分文件代码,适用场景:处理少数代码文件的异常提交,获取稳定版本的代码进行修改或回退。
基本语法 git branch <commit-hash> 文件路径
优点:修改简洁,可同时修改不同提交的文件
js
# 查看提交历史找到要撤销的提交ID
git log --oneline -5
# 同时获取两次提交中的代码
git checkout def5678 -- src/utils/dialog.ts
git checkout 83b900b9 -- src/utils/index.ts
git revert
撤销提交代码,适用场景:撤销提交代码,弃用提交代码
基本语法 git revert <commit-hash>
常见使用场景
1. 撤销最近的一次提交
js
git revert HEAD
执行后会打开编辑器让你输入新的提交信息,默认是:Revert "被撤销的提交信息"
2. 撤销指定的一次提交
js
# 查看提交历史找到要撤销的提交ID
git log --oneline
# 输出示例:
# a1b2c3d (HEAD -> main) 添加新功能
# d4e5f6g 修复bug
# h7i8j9k 初始化项目
# 撤销 d4e5f6g 这个提交
git revert d4e5f6g
# 撤销最新的第三次提交
git revert HEAD~3
3. 撤销多个连续的提交
js
# 撤销从旧提交到新提交之间的所有提交
git revert <旧提交ID>..<新提交ID>
# 例如:撤销 d4e5f6g 到 a1b2c3d 之间的所有提交
git revert d4e5f6g..a1b2c3d
# 撤销最近3次提交
git revert HEAD~3..HEAD
4. 撤销多个不连续的提交
js
# 按顺序撤销多个提交(会依次创建多个 revert 提交)
git revert <提交ID1> <提交ID2> <提交ID3>
常用参数选项
js
# --no-commit 或 -n
# 暂不自动提交,方便合并多个 revert
git revert --no-commit <commit-hash>
# 手动提交
git commit -m "自定义回退信息"
# --edit 或 -e
# 编辑提交信息(默认行为)
git revert -e <commit-hash>
# webstorm 按i键进入insert插入模式,编辑玩提交信息后按alt+q退出插入模式,输入:wq完成编辑
# --no-edit
# 不编辑提交信息,使用默认信息
git revert --no-edit <commit-hash>
场景:撤销合并提交
js
# 撤销合并提交需要指定父提交
# 查看合并提交信息
git show <合并提交ID>
# 撤销合并提交(使用第一个父提交)
git revert -m 1 <合并提交ID>
处理冲突
js
# 1. 解决冲突后
git add <解决冲突的文件>
# 2. 继续 revert 过程
git revert --continue
# 或者放弃 revert
git revert --abort
# 或者跳过这个提交
git revert --skip
git reset
git reset 是一个强大的命令,用于撤销更改、移动分支指针或重置暂存区。根据不同的参数,它可以影响三个地方:工作目录 、暂存区 、HEAD指针。
一、reset 的三个模式
1. --soft(最安全)
只移动 HEAD 指针,不影响暂存区和工作目录。
bash
perl
# 撤销上一次提交,但保留修改在暂存区
git reset --soft HEAD~1
# 撤销多次提交,保留所有修改在暂存区
git reset --soft HEAD~3
2. --mixed(默认模式)
移动 HEAD 指针,重置暂存区,但不影响工作目录。
bash
perl
# 撤销上一次提交,取消暂存,但保留工作目录的修改
git reset HEAD~1
# 或
git reset --mixed HEAD~1
# 将特定文件从暂存区移除
git reset HEAD file.txt
3. --hard(最危险)
移动 HEAD 指针,重置暂存区,清空工作目录修改。
bash
perl
# 完全撤销上一次提交的所有更改
git reset --hard HEAD~1
# 放弃所有未提交的修改
git reset --hard HEAD
二、常见应用场景
场景1:撤销最近一次提交但保留修改
bash
perl
# 不小心提交了,想重新编辑再提交
git reset --soft HEAD~1
# 文件还在暂存区,可以修改后重新提交
git commit -m "新的提交信息"
场景2:撤销提交并取消暂存
bash
csharp
# 提交后发现有问题,想重新整理文件
git reset HEAD~1
# 文件保留在工作目录,但不在暂存区
git add .
git commit -m "重新提交"
场景3:完全放弃本地修改
bash
perl
# 本地改乱了,想完全回到上次提交的状态
git reset --hard HEAD
# 或者回到指定提交
git reset --hard a1b2c3d
场景4:合并多个提交
bash
perl
# 将最近3个提交合并成1个
git reset --soft HEAD~3
git commit -m "合并三个提交为一个"
场景5:从暂存区移除文件
bash
csharp
# 错误地添加了文件到暂存区
git add . # 添加了所有文件
git reset HEAD unwanted-file.txt # 只移除这个文件
三、实际操作示例
示例1:修改最近一次提交
bash
perl
# 当前状态:刚刚提交了,但发现漏了一个文件
git log --oneline -1
# a1b2c3d 添加用户登录功能
# 1. 撤销提交但保留修改
git reset --soft HEAD~1
# 2. 添加漏掉的文件
git add missing-file.js
# 3. 重新提交
git commit -m "添加用户登录功能(完整版)"
示例2:撤销多个提交
bash
perl
# 提交历史
# f1a2b3c 添加样式
# e4d5c6b 添加功能
# d7e8f9a 初始化项目
# 撤销最近2个提交,保留修改
git reset --soft HEAD~2
# 现在 f1a2b3c 和 e4d5c6b 的修改都在暂存区
# 或者完全丢弃最近2个提交
git reset --hard HEAD~2
示例3:恢复到特定版本
bash
perl
# 查看历史找到目标提交
git log --oneline
# 恢复到指定提交(保留后续修改在工作目录)
git reset --mixed a1b2c3d
# 恢复到指定提交(完全丢弃后续修改)
git reset --hard a1b2c3d
四、reset 与 revert 对比
| 场景 | 使用 reset | 使用 revert |
|---|---|---|
| 本地未推送的提交 | ✅ 推荐 | ❌ 没必要 |
| 已推送的提交(个人分支) | ✅ 可用 | ✅ 可用 |
| 已推送的提交(团队分支) | ❌ 危险 | ✅ 推荐 |
| 想保留提交历史 | ❌ 会删除历史 | ✅ 保留历史 |
| 想完全删除敏感信息 | ✅ 可以 | ❌ 会留下记录 |
回退项目版本
要将项目回退到某个版本并推送到远程仓库,根据不同的场景有以下几种方法:
方法1:使用 reset(适合个人分支或确定没人使用该分支)
步骤1:找到目标版本
bash
bash
# 查看提交历史,找到要回退到的版本ID
git log --oneline
# 输出示例:
# f1a2b3c (HEAD -> main) 添加新功能
# e4d5c6b 修复bug
# d7e8f9a 添加登录页面 <-- 你想回退到这个版本
# a1b2c3d 初始化项目
步骤2:回退本地版本
bash
perl
# 回退到目标版本(d7e8f9a)
git reset --hard d7e8f9a
# 或者使用相对位置(回退2个版本)
git reset --hard HEAD~2
步骤3:强制推送到远程
bash
perl
# 强制推送到远程(会覆盖远程的历史)
git push origin 分支名 --force
# 或简写
git push -f origin 分支名
# 例如推送到main分支
git push -f origin main
方法2:使用 revert(适合团队协作,更安全)
步骤1:找到要撤销的版本范围
bash
bash
# 查看提交历史
git log --oneline
# 输出:
# f1a2b3c 添加新功能
# e4d5c6b 修复bug
# d7e8f9a 添加登录页面 <-- 你想回退到这个版本
# a1b2c3d 初始化项目
步骤2:创建反向提交
bash
perl
# 方法A:逐个撤销(推荐)
git revert d7e8f9a..f1a2b3c
# 这会在d7e8f9a之后创建新的提交来撤销e4d5c6b和f1a2b3c
# 方法B:如果只想撤销到指定版本
git revert --no-commit d7e8f9a..HEAD
git commit -m "Revert: 回退到登录页面版本"
步骤3:正常推送
bash
perl
# 正常推送,不需要强制
git push origin 分支名
方法3:完整的 reset 操作示例
bash
perl
# 1. 先拉取最新代码
git pull origin main
# 2. 查看提交历史
git log --oneline -10
# 3. 创建备份分支(安全措施)
git branch backup-branch
# 4. 回退到目标版本(例如回退3个版本)
git reset --hard HEAD~3
# 5. 确认回退后的状态
git log --oneline -5
git status
# 6. 强制推送到远程
git push -f origin main
# 7. 如果其他人拉取了代码,需要他们重新拉取
# 其他团队成员执行:
git fetch origin
git reset --hard origin/main
方法4:如果需要保留回退前的版本作为备份
bash
perl
# 1. 先创建备份分支
git branch backup-before-reset
# 2. 回退到目标版本
git reset --hard d7e8f9a
# 3. 强制推送
git push -f origin main
# 4. 如果需要恢复,可以用备份分支
git checkout backup-before-reset
git branch -D main
git branch -m main
git push -f origin main
方法5:处理已经推送的敏感信息
如果是因为不小心提交了密码等敏感信息需要删除:
bash
perl
# 1. 找到包含敏感信息之前的版本
git log --oneline
# 2. 彻底删除所有包含敏感信息的提交
git reset --hard 安全版本ID
# 3. 强制推送(会完全删除远程的历史)
git push -f origin main
# 4. 通知所有协作者重新克隆或强制拉取
git fetch --all
git reset --hard origin/main