修改远程git仓库提交的代码,回退项目版本

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
相关推荐
CoderJia程序员甲3 小时前
GitHub 热榜项目 - 日榜(2026-02-28)
人工智能·ai·大模型·github·ai教程
啊哈的哲学路途3 小时前
【git、gitee、github、gitlab 区别以及功能】
git·gitee·github
一次旅行3 小时前
云部署Openclaw龙虾接入飞书PPT问题
人工智能·github·飞书
成都极云科技4 小时前
「服务器托管平台」-打造高效稳定的云服务基石
运维·服务器·github
zhensherlock4 小时前
Protocol Launcher 系列:一键唤起 Windsurf 智能 IDE
javascript·ide·vscode·ai·typescript·github·ai编程
Maya动画技术4 小时前
github-2fa认证是啥意思
github·2fa恢复码使用方法
怪侠_岭南一只猿4 小时前
爬虫阶段二实战练习题一:模拟登录github获取个人信息复盘
爬虫·github
YMWM_5 小时前
linux命令行测试是否可以访问google、github、huggingface
linux·运维·github
WangJunXiang65 小时前
系统安全及应用
安全·github·系统安全