如何通过命令和TortoiseGit工具来撤销最后一次提交,包含提交到缓存区,提交到远程仓库

文章目录

撤销最后一次提交是Git中的常见操作,但根据提交的不同状态(已提交到本地、已推送到远程),需要使用不同的方法。下面详细说明通过命令行和TortoiseGit工具的各种撤销场景。

📊 撤销操作概览

操作场景 命令行方法 TortoiseGit方法 影响范围
1. 仅撤销到工作区 (未暂存) git reset --soft HEAD~1 日志中右键→重置到this...→软重置 本地
2. 撤销到暂存区 (已暂存) git reset --mixed HEAD~1 日志中右键→重置到this...→混合重置 本地
3. 完全丢弃修改 git reset --hard HEAD~1 日志中右键→重置到this...→硬重置 本地
4. 已推送到远程 git revert HEAD 日志中右键→还原此提交 本地+远程

开始撤销最后一次提交
提交状态是什么?
场景1: 仅提交到本地仓库

使用 git reset
场景2: 已推送到远程仓库

使用 git revert
保留修改还是丢弃?
保留在工作区

--soft
保留在暂存区

--mixed
完全丢弃

--hard
创建反向提交

撤销之前的提交
推送反向提交到远程
最终状态:

修改在工作区, 可重新提交
最终状态:

修改在暂存区, 可修改后提交
最终状态:

完全回到提交前状态
最终状态:

产生新提交, 历史保留

💻 命令行方法

场景1:仅提交到本地仓库(未推送)

1. 仅撤销提交,保留修改到工作区
bash 复制代码
# 撤销提交,但保留所有更改在工作目录中(未暂存状态)
git reset --soft HEAD~1
  • 效果:撤销最后一次提交,所有更改保留在工作区,可重新编辑后提交
  • 适用场景:提交信息写错,或需要添加更多文件
2. 撤销提交,保留修改到暂存区
bash 复制代码
# 撤销提交,更改保留在暂存区
git reset --mixed HEAD~1
# 或简写为(mixed是默认选项)
git reset HEAD~1
  • 效果:撤销提交,更改保留在暂存区(已git add状态)
  • 适用场景:需要重新组织提交内容
3. 完全丢弃最后一次提交的修改
bash 复制代码
# 完全丢弃最后一次提交的所有更改
git reset --hard HEAD~1
  • ⚠️ 警告:此操作不可逆!提交的更改将永久丢失
  • 适用场景:完全不需要这个提交的内容

场景2:已推送到远程仓库

1. 安全撤销 - 创建反向提交(推荐)
bash 复制代码
# 创建一个新的提交来撤销之前的提交
git revert HEAD
  • 这会打开编辑器让你填写撤销提交的信息
  • 保存后自动创建一个新的提交,撤销前一个提交的更改
  • 之后推送到远程:
bash 复制代码
git push origin 分支名
2. 强制覆盖远程(谨慎使用)
bash 复制代码
# 1. 首先在本地撤销提交
git reset --soft HEAD~1  # 或 --mixed/--hard

# 2. 强制推送到远程(会覆盖远程历史)
git push origin 分支名 --force
# 或更安全的
git push origin 分支名 --force-with-lease
  • ⚠️ 注意:这会重写远程历史,如果其他人已拉取代码,会造成混乱
  • 仅适用于个人分支或团队协商后使用

🐢 TortoiseGit工具方法

场景1:仅提交到本地仓库

方法1:通过日志撤销
  1. 右键项目文件夹 → TortoiseGit显示日志
  2. 在日志窗口中,右键点击要撤销的提交
  3. 选择 重置到 this...
  4. 在弹出的对话框中选择重置类型:
    • 软重置 (soft):保留修改到工作区
    • 混合重置 (mixed):保留修改到暂存区
    • 硬重置 (hard):完全丢弃修改
  5. 点击 确定
方法2:通过重置对话框
  1. 右键项目文件夹 → TortoiseGit重置
  2. 在"重置"对话框中:
    • 分支:选择当前分支
    • 到:输入 HEAD~1 或点击"..."选择上一个提交
    • 重置类型:选择软/混合/硬
  3. 点击 确定

场景2:已推送到远程仓库

方法1:创建反向提交(推荐)
  1. 右键项目文件夹 → TortoiseGit显示日志
  2. 在日志窗口中,右键点击要撤销的提交
  3. 选择 还原此提交
  4. 在弹出的对话框中确认
  5. TortoiseGit会创建一个反向提交,之后会提示你填写提交信息
  6. 填写后提交,然后推送到远程
方法2:强制覆盖远程
  1. 先按上述方法在本地重置(reset)
  2. 右键项目文件夹 → TortoiseGit推送
  3. 在推送对话框中勾选 强制推送
  4. 点击 确定(⚠️ 谨慎使用)

🎯 特殊场景处理

1. 撤销多个提交

bash 复制代码
# 撤销最近的3个提交,保留修改到工作区
git reset --soft HEAD~3

# 通过TortoiseGit:日志中选择多个提交,右键"重置到this"

2. 查看撤销前的状态

如果撤销后想恢复,可查看引用日志:

bash 复制代码
# 查看所有历史操作
git reflog

# 恢复到撤销前的状态
git reset --hard HEAD@{1}

3. 只撤销特定文件的修改

bash 复制代码
# 从最后一次提交中撤销对特定文件的修改
git checkout HEAD~1 -- 文件名

📋 最佳实践与注意事项

  1. 已推送的提交 :优先使用 git revert 而不是 git reset --force

  2. 协作分支:避免在共享分支上使用强制推送

  3. 备份 :重要提交在撤销前可创建分支备份

    bash 复制代码
    git branch backup-branch
  4. TortoiseGit提示:撤销后如需推送,TortoiseGit会提示推送操作

  5. 测试环境:不确定时先在测试仓库练习

🔄 操作后验证

撤销后建议检查状态:

bash 复制代码
git status
git log --oneline

通过以上方法,你可以安全地撤销任何状态的最后一次提交。关键是根据是否已推送是否要保留修改来选择合适的方法。

上一篇:推送(Push)代码到Git仓库时,忘了先拉取(Pull),提示冲突,但冲突的不是同一个文件,后续怎么处理冲突


不积跬步,无以至千里。


代码铸就星河,探索永无止境

在这片由逻辑与算法编织的星辰大海中,每一次报错都是宇宙抛来的谜题,每一次调试都是与未知的深度对话。不要因短暂的"运行失败"而止步,因为真正的光芒,往往诞生于反复试错的暗夜。

请铭记

  • 你写下的每一行代码,都在为思维锻造韧性;
  • 你破解的每一个Bug,都在为认知推开新的门扉;
  • 你坚持的每一分钟,都在为未来的飞跃积蓄势能。

技术的疆域没有终点,只有不断刷新的起点。无论是递归般的层层挑战,还是如异步并发的复杂困局,你终将以耐心为栈、以好奇心为指针,遍历所有可能。

向前吧,开发者

让代码成为你攀登的绳索,让逻辑化作照亮迷雾的灯塔。当你在终端看到"Success"的瞬间,便是宇宙对你坚定信念的回响------
此刻的成就,永远只是下一个奇迹的序章! 🚀


(将技术挑战比作宇宙探索,用代码、算法等意象强化身份认同,传递"持续突破"的信念,结尾以动态符号激发行动力。)

cpp 复制代码
//c++ hello world示例
#include <iostream>  // 引入输入输出流库

int main() {
    std::cout << "Hello World!" << std::endl;  // 输出字符串并换行
    return 0;  // 程序正常退出
}

print("Hello World!")  # 调用内置函数输出字符串

package main  // 声明主包
py 复制代码
#python hello world示例
import "fmt"  // 导入格式化I/O库
go 复制代码
//go hello world示例
func main() {
    fmt.Println("Hello World!")  // 输出并换行
}
C# 复制代码
//c# hello world示例
using System;  // 引入System命名空间

class Program {
    static void Main() {
        Console.WriteLine("Hello World!");  // 输出并换行
        Console.ReadKey();  // 等待按键(防止控制台闪退)
    }
}
相关推荐
南山nash7 小时前
git从入门到熟练
git
夜流冰10 小时前
Git - GitForWindows
git
一个很帅的帅哥10 小时前
部署chat-vue
大数据·git·elasticsearch
芒鸽11 小时前
鸿蒙PC使用ffmpeg+electron实现视频中音频的提取
git
SunkingYang11 小时前
使用TortoiseGit工具推送(push)时,忘了先拉取(Pull),提示冲突,后续怎么处理冲突?
git·tortoisegit·pull·push·推送·冲突·拉取
BestOrNothing_201512 小时前
Git 团队开发冲突合并全流程:本地是否改动 + 远端是否更新,如何正确同步并合并(同分支/不同分支下的几种场景)
git·分支管理·git pull·git merge·分支冲突·git协作·git fetch
zzlyyds12 小时前
工作的时候遇到的git版本冲突与合并问题
git
BestOrNothing_201512 小时前
Git fetch 详解:git fetch 和 git fetch origin 到底有什么区别?(origin/xxx、远端跟踪分支一次讲透)
git·分支管理·开发规范·新手教程·fetch / origin·本地/远程 分支·detached head
gsls20080813 小时前
服务器状态监控Uptime Kuma
运维·服务器·git