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

【git】 撤销revert一次commit中的某几个文件

是的,您可以撤销(revert)某个 commit 中对单个文件的更改,但这不能通过 git revert 命令直接完成,因为 git revert 的设计目标是撤销整个提交。

不过,您可以通过几个步骤来实现只撤销单个文件的效果,最常用和直接的方法是使用 git checkoutgit restore。这个过程会创建一个新的 commit,其中包含了对那个文件所做的撤销操作。

推荐方法:使用 git checkout

这种方法通过从特定的历史节点检出文件内容,然后创建一个新的提交来实现。

步骤如下:

  1. 找到引入不必要更改的 commit 的哈希值 (commit hash)
    使用 git loggit log --oneline 查看提交历史,找到您想要撤销文件更改的那个 commit 的哈希值。

    git log path/to/your/file
    

    这将显示所有修改过该文件的提交记录。假设您想撤销的 commit 哈希是 a1b2c3d4

  2. 检出该文件在之前 commit 中的版本
    您需要将该文件恢复到 a1b2c3d4 这个 commit 之前的状态。要做到这一点,您需要使用该 commit 的父提交(用 a1b2c3d4^ 表示)。

    git checkout a1b2c3d4^ -- path/to/your/file
    
    • a1b2c3d4^ 指向 a1b2c3d4 的上一个 commit。
    • -- 是一个安全措施,用来分隔 commit 哈希和文件路径,以防文件名与分支名混淆。

    执行此命令后,指定的文件在您的工作目录中就会被恢复到之前的版本,并且该更改会自动被添加到暂存区 (staging area)。

  3. 创建一个新的 commit
    现在,您需要提交这个“撤销”更改,以创建一个新的历史记录。

    git commit -m "Revert changes to path/to/your/file from commit a1b2c3d4"
    

    这个新的 commit 包含了对单个文件的撤销操作。

  4. 推送到远程仓库
    最后,将这个新的 commit 推送到远程仓库。

    git push origin <your-branch-name>
    

替代方法:使用 git restore (适用于较新版本的 Git)

从 Git v2.23.0 开始,引入了 git restore 命令,它的职责更明确,专门用于恢复工作区的文件。

步骤如下:

  1. 找到目标 commit 哈希值(同上)。

  2. 使用 git restore 恢复文件

    git restore --source=a1b2c3d4^ -- path/to/your/file
    

    这个命令会从 a1b2c3d4 的父提交中获取文件内容,并更新您的工作目录。

  3. 暂存并提交更改
    git restore 不会自动将文件添加到暂存区,所以您需要手动添加。

    git add path/to/your/file
    git commit -m "Restore path/to/your/file to a previous version"
    
  4. 推送到远程仓库(同上)。

更复杂的方法:使用 git revert --no-commit

这种方法比较取巧,但也能实现目的。它首先对整个 commit 执行撤销操作,但不立即提交,然后您再手动选择只保留针对特定文件的更改。

步骤如下:

  1. 执行 revert 但不提交

    git revert --no-commit <commit_hash>
    

    这会将 <commit_hash> 中所有文件的更改都反向应用到您的工作目录和暂存区,但不会自动创建新的 commit。

  2. 重置暂存区
    将暂存区的所有内容都取消暂存,这样您就可以只选择想要撤销的那个文件。

    git reset
    
  3. 只暂存您想撤销的文件

    git add path/to/your/file
    
  4. 提交更改

    git commit -m "Revert changes for path/to/your/file"
    
  5. 丢弃其他不必要的更改
    此时,您工作目录里还有其他来自 revert 命令但您不希望保留的更改。您可以用以下命令丢弃它们:

    git checkout -- .
    

这三种方法最终都能安全地撤销单个文件的更改并保留清晰的提交历史。对于大多数情况,第一种使用 git checkout 的方法是最简单直接的。

http://www.xdnf.cn/news/18211.html

相关文章:

  • SpringAIAlibaba之基础功能和基础类源码解析(2)
  • AC 应用控制技术
  • cursor快速了解项目结构-自己用
  • 读《精益数据分析》:营收(Revenue)—— 设计可持续盈利模式
  • 网络通信基础:从数据链路层到传输层
  • 用 C++ 构建高性能测试框架:从原型到生产实战指南
  • cursor+mcp-clickhouse进行数据分析
  • 无人机/航测/三维建模领域常见的“航线规划或建模方式
  • 【CPP】一个CPP的Library(libXXXcore)和测试程序XXX_main的Demo
  • 深入解析:Unity、Unreal Engine与Godot引擎中的Uniform变量管理
  • 易基因:常见生信分析图细节解析(第一期)
  • 通信方式:命名管道
  • 【科研绘图系列】R语言绘制多种小提琴和云雨图
  • Redisson 分布式锁核心机制解析
  • Hive 存储管理测试用例设计指南
  • GaussianLSS
  • RxJava 在 Android 即时通讯中的应用:封装、处理与控制
  • 基于zephyr使用stm32的LTDC点亮ARGB8888LCD触摸屏
  • 服务器数据恢复—硬盘坏道离线导致raid崩溃的StorNext文件系统数据恢复案例
  • 【服务器】Apache Superset功能、部署与体验
  • 解决 UniApp 自定义弹框被图片或 Canvas 覆盖的 Bug
  • 代码随想录算法训练营四十六天|图论part04
  • MFC中使用EXCEL的方法之一
  • UDI数据库应用之后端本地数据库搭建实战(二)
  • 【高并发内存池】一、简介 定长内存池实现
  • 156-基于Flask的北京市商铺数据可视化分析系统
  • k8sday11服务发现(2/2)
  • 微服务如何集成swagger3
  • 工业相机基本知识解读:像元、帧率、数据接口等
  • 解决linux中磁盘爆满(准确说是文件系统爆满)导致mysql启动失败的问题——对文件系统进行扩容