当前位置: 首页 > news >正文

如何撤销Git提交误操作

要撤销在主分支上的 git add .git commit 操作,可以按照以下步骤安全回退:

完整回退步骤:

# 1. 查看提交历史,确认要回退的commit
git log --oneline# 示例输出:
# d3f4g7h (HEAD -> main) 误操作提交
# a1b2c3d 之前的正常提交# 2. 回退到上一个提交状态(保留工作区修改)
git reset --soft HEAD~1# 3. 取消所有已暂存的更改(撤销git add)
git reset# 4. 检查当前状态(应显示所有修改文件未暂存)
git status# 5. 创建并切换到新分支(正确的工作流程)
git checkout -b feature/my-new-branch# 6. 重新添加并提交更改
git add .
git commit -m "正确的提交消息"# 7. 推送到远程新分支
git push -u origin feature/my-new-branch

关键命令说明:

命令作用说明
git log --oneline查看提交历史确认要回退的commit
git reset --soft HEAD~1撤销最后一次commit保留所有修改在工作区
git reset取消所有暂存撤销 git add . 操作
git status检查状态确认文件处于未暂存状态
git checkout -b <branch>创建并切换分支开始正确的工作流程

注意事项:

  1. 如果已经推送到远程仓库

    # 强制回退远程分支(谨慎使用)
    git push origin main --force
    

    注意:这会覆盖远程历史,确保其他协作者知道这个操作

  2. 完全丢弃所有修改(如果不需要保留):

    # 回退并丢弃所有修改
    git reset --hard HEAD~1
    
  3. 恢复误删的提交(如果操作失误):

    # 查看所有操作记录
    git reflog# 恢复特定commit
    git reset --hard <commit-hash>
    

正确的工作流程图示:

开始工作
是否在主分支?
git checkout -b feature/new
继续工作
修改代码
git add & commit
git push origin feature/new
创建合并请求
代码审查
合并到主分支

预防措施:

  1. 保护主分支

    # 禁止直接推送到主分支
    git config --global receive.denyCurrentBranch updateInstead
    
  2. 使用钩子防止误操作
    .git/hooks/pre-commit 中添加:

    #!/bin/sh
    branch=$(git symbolic-ref --short HEAD)
    if [ "$branch" = "main" ]; thenecho "错误:请勿直接在main分支提交!"exit 1
    fi
    
  3. 别名设置

    # 添加到 ~/.gitconfig
    [alias]cm = "!f() { if [ \"$(git symbolic-ref --short HEAD)\" = \"main\" ]; then echo '请勿在main分支提交'; else git commit -m \"$1\"; fi }; f"
    

    使用 git cm "消息" 提交时会自动检查分支

总结:

  1. 使用 git reset --soft HEAD~1 + git reset 撤销提交和暂存
  2. 立即切换到新分支 git checkout -b feature/xxx
  3. 在新分支重新提交更改
  4. 推送到远程并创建合并请求

这样既能安全回退误操作,又能保持仓库整洁,符合标准的 Git 工作流程。

http://www.lryc.cn/news/595969.html

相关文章:

  • 【音视频协议篇】RTMP协议
  • haproxy的负载均衡集群搭建
  • 构建智能视频中枢--多路RTSP转RTMP推送模块在轨道交通与工业应用中的技术方案探究
  • 最新AI与Python在地球科学多源数据交叉融合中的前沿技术应用
  • linux用户态各定时器抖动测试
  • 「Linux命令基础」用户组管理
  • MongoDB频繁掉线频繁断开服务的核心原因以及解决方案-卓伊凡|贝贝|莉莉|糖果
  • stream流入门
  • 企业知识库软件选型与实践指南
  • LINUX 722 逻辑卷快照
  • useState
  • 3.4 安全-分布式-数据库-挖掘
  • Java并发编程:JUC核心组件全解析
  • IMU(LSM6DSMTR+LIS2MDLTR)
  • 隧道代理与普通代理:一场网络隐身术的“智能革命”
  • 开发者的AI认知指南:用大模型重新理解人工智能(上)
  • 基于AutoJawSegment项目的CBCT图像分割实践指南
  • Qt开发环境搭建全攻略(Windows+Linux+macOS)
  • Navicat 远程连接SQLlite数据库
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-微博基本信息实现
  • DearMom以“新生儿安全系统”重塑婴儿车价值,揽获CBME双项大奖
  • 数据库隔离级别
  • 在vscode 使用 remote-ssh
  • Vue3 面试题及详细答案120道(16-30 )
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现持械检测(C#代码,UI界面版)
  • 【Altium Designer2025】电子设计自动化(EDA)软件——Altium Designer25版保姆级下载安装详细图文教程(附安装包)
  • ob导出租户所有表记录
  • SpringBoot--Mapper XML 和 Mapper 接口在不同包
  • C++中的list(2)简单复现list中的关键逻辑
  • 文本分类与情感分析Python实战