重写历史记录以撤消对 git 中当前分支上的文件的所有更改

2023-12-03

假设我有一个修改六个文件的功能分支。该分支上的大部分提交都涉及file.py。我最终意识到有一种可能更好的方法来实现此功能而无需触摸file.py根本不。有没有办法调整我的分支上的所有提交以不触及该文件?我觉得应该有某种交互式变基技巧可以轻松做到这一点,但我不确定那是什么技巧。

当然,我可以简单地将更改恢复为新的提交,但似乎很遗憾为后代弄乱了历史。


进行交互式变基一直回到分支“开始”之前的提交(即,到最近可到达的提交,其中该文件仍然是您想要的方式)。我们称之为提交abcde:

git rebase -i abcde

将出现待办事项列表,列出“好”提交之后的所有提交。

pick 11111
pick 22222
pick 33333
...

在待办事项列表中,标记每个提交edit.

edit 11111
edit 22222
edit 33333
...

保存并关闭编辑器。变基将开始。当变基中的每个阶段停止并等待您的指令时,从分支之前恢复相关文件的状态:

git restore --source abcde --worktree --staged -- <pathToFile>
git rebase --continue

您的编辑会询问您是否要更改提交消息;你不需要,所以只需关闭编辑器,然后我们就可以进行下一次提交。

当您到达该过程的最后时,您将一路携带未更改的文件通过分支。


It is possible to automate everything I just said by using git filter-repo, but you asked for a trick with interactive rebase, so that's what I described.

Also, note that if you happen know that the file in question was not altered in a particular commit, you can leave that commit set to pick in the Todo list and thus save some steps. There are ways to find that out. But my answer is deliberately simple and ignores that issue.


我总是喜欢用一个例子来证明我的答案。开场情况如下:

* f2fa796 (HEAD -> main) three
* dc90263 two
* 4861739 one

每个提交都有一个文件a.txt,并且它从之前的提交中更改了该文件,正如我现在将展示的:

% git show HEAD:a.txt
aaa
% git show HEAD~1:a.txt
aa
% git show HEAD~2:a.txt
a

很好,让我们开始交互式变基:

% git rebase -i 4861739

在编辑器中,我将两个提交标记为edit,然后关闭编辑器。变基开始:

Stopped at dc90263...  two
You can amend the commit now, with

  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue

所以我说:

% git restore --source 4861739 --staged --worktree -- a.txt
% git rebase --continue

我们继续进行下一次提交。该文件中存在合并冲突,但这对我来说并不重要:

% git restore --source 4861739 --staged --worktree -- a.txt
% git rebase --continue   

Git 说:

Successfully rebased and updated refs/heads/main.

现在让我们再次检查一下情况:

% git show HEAD:a.txt
a 
% git show HEAD~1:a.txt                                    
a
% git show HEAD~2:a.txt                                    
a

这正是我们想要的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写历史记录以撤消对 git 中当前分支上的文件的所有更改 的相关文章

  • 主存储库和本地存储库在同一台机器上

    我是 Git 新手 我已经在 Linux 服务器中创建了一个主存储库 同一个服务器将由 5 组 每组 3 个用户 使用 我想为每个组创建一个本地存储库 小组成员又应该为每个人创建一个本地存储库 使用内容并将修改提交到小组的本地存储库 我该怎
  • 无法将 git add origin git@anything 与新的 git 目录一起使用

    我有一个项目 我正在生成许多提交 因此它占用的空间正在快速增长 由于我有一个 gitlab 页面来推送提交 因此我决定最好删除本地 git 目录中的这些旧提交 因为我始终可以从 gitlab 获取它们 为此 我只需删除本地 git 目录 然
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • git checkout 到分支需要很长时间

    我使用的是 Ubuntu 17 10 并且使用 git 版本 2 14 1 每当我从 master 创建一个分支并尝试签出它 或从它签出到 master 时 都会花费大量时间 大约几分钟 有时接近 10 分钟 确实 我有几 GB 的数据 但
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • 从 github 中删除子项目提交

    我有两个存储库A and B 我错误地在我的机器上将仓库 B 克隆到了 A 内 我从存储库 B 中删除了所有代码 但是当我在源上从 A 推送并合并代码时 它还显示了子项目提交B在 Github 仓库上 我想从我的 master 上删除子项目
  • Git 扩展 - 无法在 Windows 上推送到网络驱动器中的 git bare 存储库

    我正在 Windows 上学习 git 我已经安装了 Git 扩展 版本 2 47 3 并使用了它 我在我的 C 单元中创建了一个裸存储库 作为中央存储库 并在硬盘中的其他任何位置创建了个人存储库 我对硬盘中的这两个存储库进行提交 推送和拉
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol
  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • 我可以忽略全局 .gitignore 吗?

    我的全局 gitignore 一般都很棒 但对于这个一次性项目 我不希望应用全局规则 如何删除这个怪异存储库的全局 gitignore 规则 在您的存储库中运行此命令 git config local core excludesfile f
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一

随机推荐

  • Android 删除本地化

    我在 Play 商店中的应用程序没有除默认版本之外的任何本地化版本 美国英语 这次我创建了一个新的apk来更新它 它使用android support v7 appcompat图书馆 因此 当我上传新的 apk 并在 apk 详细信息中显示
  • 为什么此查询会导致 Oracle 中的合并笛卡尔连接

    我最近有一个查询需要修改 这是原文 SELECT RTRIM position AS POSITION Other fields FROM schema table x WHERE hours gt 0 AND pay RGW AND NO
  • 将大量数据从 C# 导出到 Excel 的最佳/最快方法是什么

    我有使用 OpenXML 库导出数据的代码 我有 20 000 行和 22 列 这需要很长时间 大约 10 分钟 有没有任何解决方案可以将数据从 C 导出到 Excel 速度会更快 因为我是从 ASP NET MVC 应用程序执行此操作 而
  • IMFSinkWriter无法导出mp4的大尺寸视频

    我的 Windows MFC 应用程序具有导出视频文件的功能 并且它可以选择编码格式 通过WMV or MP4 和框架尺寸 但是 不幸的是当我尝试导出时MP4每次都设置大帧大小的文件MF E INVALIDMEDIATYPE发生了 简而言之
  • 正则表达式:按逗号分割,但排除括号和引号内的逗号(单引号和双引号)

    我有一根绳子 5 5 5 C A B A B B A A B C A B 我想用逗号分割它 但需要排除括号和引号内的逗号 单引号和双引号 像这样 5 5 5 C A B A B B A A B C A B 使用java正则表达式如何实现这一
  • AWS:将 Cognito 授权用户限制为特定 Lambda 函数

    我正在使用 AWS 并且有以下设置 UserPool API网关 Lambda函数 API 网关使用 UserPool 授权者来保护 lambda 函数 到目前为止 这是有效的 现在我想将每个 lambda 函数限制为特定的用户组 因此 我
  • Apple 的静默推送通知可以在后台启动我的应用程序吗?

    根据苹果的文档 我可以通过添加来注册静默通知 content available 1键值对aps有效负载字典 我希望我的应用程序在无声通知到达时在后台唤醒 我设置App downloads content in response to pu
  • 在 Azure ML 上安装附加 R 包

    我正在执行以下步骤将 R Hash 2 2 6 zip 包安装到 Azure ML 将 zip 文件作为数据集上传 创建一个新实验并添加 执行 R 脚本 进行实验 拖放 zip 文件数据集进行实验 将步骤3中的数据集连接到步骤2的 执行R脚
  • 泽西岛和 HK2 服务定位器

    我正在尝试在 Application 构造函数 从 ResourceConfig 继承的东西 中初始化 Jersey 应用程序中的一些组件 看起来像这样 public Application Context ServletContext c
  • 如何将数据从 Webform 页面发布到 HTTPHandler.ashx 文件?

    我有一个 Web 应用程序项目来支持到供应商产品后端的文件传输操作 它由 2 个 HTTPHandler 文件组成 在带有 IIS 6 0 的 Win2003 服务器上编译成网站 上传处理程序 ashx 下载处理程序 ashx 这些文件从公
  • pyCuda,发送多个单变量参数的问题

    我这里有一个 pycuda 程序 它从命令行读取图像并保存反转颜色的版本 import pycuda autoinit import pycuda driver as device from pycuda compiler import S
  • mem_fun和bind1st问题

    我有以下课程 class A public ctr and etc A clone B container 现在 我有一个vector
  • Firestore,如何构建“likedBy”查询

    我在思考如何最好地构建我的 非常简单的 Firestore 应用程序时遇到了一些困难 我有一组这样的用户 users A123 name Adam B234 name Bella C345 name Charlie 每个用户都可以 喜欢 或
  • 使两个角圆化和两个直切而不是颤振中的曲线

    我怎样才能在颤振中制作下面的瓷砖状设计 两侧有一点弯曲 两侧的其余部分是直线切割的柔和曲线 我可以制作两个圆角和两个非圆角 但无法制作如下所示的一个 任何人都知道如何制作这样的瓷砖 我已经使用了 RoundRect ClipRRect 和
  • 如何在 C# 中向 UserControl 添加事件?

    我有一个包含 3 个标签的 UserControl 我想为其添加一个事件 该事件在标签之一的文本更改时发生 我正在使用 Visual Studio 2010 首先 您需要在类中声明事件 以及您的方法和构造函数 public event Ev
  • 创建 8 位图像

    我正在尝试创建具有纯背景色的 8 位图像 看起来应该非常简单 但文件上的详细信息将其列为 32 位颜色深度 我缺少什么 public void CreateImage var bmpOut new Bitmap 300 300 var g
  • SyntaxError:创建 virtualenv 时语法无效

    我想为 python 2 7 创建一个 virtualenv 我使用的是 3 7 我以管理员身份运行 cmd 在 Windows 10 上 C WINDOWS system32 gt virtualenv p C Python27 pyth
  • 从 Kafka 进行流聚合时运行“死锁”

    几天前我发布了另一个类似的问题 如何在启动Spark Streaming进程时加载历史数据 并计算运行聚合 我现在至少设法得到了一个 有效 的解决方案 这意味着该过程本身似乎可以正常工作 但是 由于我是 Spark 的初学者 我似乎错过了一
  • 为什么可以从 double 到 float 隐式转换?

    在 C 中我们可以写类似的东西 float f 3 55 这是一个合法的语句 而实数的类型是 double 我们将该 double 存储为浮点数 它本质上意味着将 8 个字节存储为 4 个字节 可能会丢失数据 我的问题是当我写的时候 lon
  • 重写历史记录以撤消对 git 中当前分支上的文件的所有更改

    假设我有一个修改六个文件的功能分支 该分支上的大部分提交都涉及file py 我最终意识到有一种可能更好的方法来实现此功能而无需触摸file py根本不 有没有办法调整我的分支上的所有提交以不触及该文件 我觉得应该有某种交互式变基技巧可以轻