如何恢复多个 Git 提交?

2023-12-08

我有一个 Git 存储库,如下所示:

A <- B <- C <- D <- HEAD

我希望分支的头指向 A,即我希望 B、C、D 和 HEAD 消失,并且我希望 head 与 A 同义。

听起来我可以尝试重新设置基准(不适用,因为我已经在两者之间推送了更改),或者恢复。但如何恢复多次提交呢?我是否一次恢复一个?顺序重要吗?


扩展我在评论中写的内容

一般规则是您不应该重写(更改)您已发布的历史记录,因为有人可能以此为基础进行工作。如果您重写(更改)历史记录,则在合并更改和更新它们时会遇到问题。

所以解决方案是创建一个新提交 which 恢复更改你想要摆脱的。您可以使用以下方法执行此操作git 恢复命令。

您有以下情况:



A <-- B  <-- C <-- D                                  <-- master <-- HEAD
  

(这里的箭头指的是指针的方向:在提交的情况下是“父”引用,在分支头(branch ref)的情况下是顶部提交,在 HEAD 引用的情况下是分支的名称)。

您需要创建的内容如下:



A <-- B  <-- C <-- D <-- [(BCD)-1]                   <-- master <-- HEAD
  

where [(BCD)^-1] means the commit that reverts changes in commits B, C, D. Mathematics tells us that (BCD)-1 = D-1 C-1 B-1, so you can get the required situation using the following commands:

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message for all of them"

适用于除合并提交之外的所有内容。


替代解决方案是checkout contents提交 A,并提交此状态。也适用于合并提交。但是,添加的文件不会被删除。如果您有任何本地更改git stash他们首先:

$ git checkout -f A -- . # checkout that revision over the top of local files
$ git commit -a

那么你就会出现下面的情况:



A <-- B  <-- C <-- D <-- A'                       <-- master <-- HEAD
  

提交 A' 与提交 A 具有相同的内容,但是不同的提交(提交消息、父级、提交日期)。


备用Jeff Ferland 的解决方案,Charles Bailey 修改建立在相同的想法之上,但使用git重置。这里稍微修改一下,这种方式适用于一切:

$ git reset --hard A
$ git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D
$ git commit
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何恢复多个 Git 提交? 的相关文章

  • git,Heroku:预接收挂钩被拒绝

    我正在设置 git 存储库并尝试将其链接到 Heroku 当我运行命令时 git push heroku master 我收到 Counting objects 7 done Delta compression using up to 2
  • Git - “非单调索引”

    我正在本地电脑上克隆 git 存储库 在此过程中 该命令会输出大量以下错误消息 error non monotonic index git objects pack pack idx 例如 该消息保留在拉动或分支交换机上 但一切似乎都有效
  • Intellij Idea可以自动阶段更改吗

    经过几天的任务处理后 我决定看看已经完成了哪些工作git status来自 Git Bash 有些文件在Changes to be committed list 有些在Changes not staged for commit 有趣的是 我
  • libgit2如何获取当前目录的状态?

    如何获取单个目录而不是整个存储库的状态 我查看了以下内容 git status list new它获取存储库状态 但我只关心位于单个目录中的文件 git status file获得单身状态 有没有办法可以使用 libgit2 获取单个目录的
  • Git 子树导出和重新导入问题

    我有一个更大的 git 存储库 A 它与我的另一个项目 B 共享一定量的代码 为了使维护更容易 我决定使用公共代码 C 创建第三个存储库 然后通过git subtree 我准备了 A 中的所有内容 将通用代码放在文件夹 sub 中 并使用了
  • Git分支切换不会改变代码文件夹文件

    这是后续this https stackoverflow com questions 9406651 code base for git master feature branch问题 我使用克隆了远程主项目文件夹git clone ema
  • 如何配置“git diff”以使用 emacs diff [重复]

    这个问题在这里已经有答案了 是否可以配置 git diff 以使用 emacs diff 如果是的话 你能告诉我怎么做吗 谢谢 看这个问题 如何使用视觉差异程序查看 git diff 输出 https stackoverflow com q
  • 如何将 HEAD 移回之前的位置? (分离头)和撤消提交

    在 Git 中 我试图做一个squash commit通过合并到另一个分支然后重置HEAD通过以下方式前往上一个地点 git reset origin master 但我需要走出这一步 如何将 HEAD 移回之前的位置 我有 SHA 1 片
  • Git merge --squash 可以保留提交注释吗?

    有没有一种方法可以自动添加压缩后的所有提交注释mybranch执行时提交 git merge squash mybranch 这样单个提交包含所有提交注释的串联mybranch 我认为这就是 git merge squash 自动执行的操作
  • git pull:无法快进,

    你能帮我解决我的问题吗 当我尝试从 dev 分支拉取时发生错误 我浏览了解决方案 它说我需要 rebase 但它对我来说没有成功 CT aohc MP1GYWQA MINGW64 c TCO source RAPMD Web Fronten
  • Git 将新的本地分支推送到远程,无需指定名称

    当针对特定的跟踪问题进行补丁修复时 我们的工作流程如下所示 1 git checkout patch git pull upstream patch make sure we re up to date 2 git checkout b i
  • 如何给 Git 控制台着色?

    我最近看到gitWindows 中的控制台是彩色的 例如绿色表示添加 红色表示删除等 我如何为我的颜色上色git这样的控制台 为了安装它 我使用了以下命令 sudo apt get install git core As noted htt
  • 尽管存在但未找到 Git https:// 存储库

    我在 github 上有一个私人仓库 它的位置被改变了 我尝试更换遥控器 但无法再按了 ls remote https github com xxxxx xxxxx git 给了我这个 远程 未找到存储库 致命 存储库 https gith
  • Git:从远程获取特定对象

    在工作中我们必须应对一个非常庞大的 git 存储库 90Go 在尝试调整本地副本上的一些内容后 我的包文件出现错误 尝试解压它 我可能删除了一些目标文件 例如 gt git GC 错误 无法读取 af9ed8 snip 致命 坏树对象 af
  • Git 和外部备份。子目录是空的,我宁愿它不是空的。

    我想使用 Git 创建外部备份系统 这部分是受到答案的启发在外部磁盘上备份整个 git 存储库的最佳方法是什么 https stackoverflow com a 4372855 2533127 其中建议如下 您还可以通过启动一个新的存储库
  • 在 $git push -u origin main 命令之后,Git bash 不请求任何身份验证,实际上什么也不做

    当我尝试将代码上传到 github 时 以下是我在 Git Bash 终端中执行的步骤 当我尝试使用将代码推送到 github 时 git push u origin main光标移动到下一行并持续闪烁 但不执行任何操作 git remot
  • 如何使用 GitLab 管道中的密钥通过 SSH 连接到目标服务器?

    当 GitLab 管道成功时 我想通过 SSH 使用公钥连接到服务器 正如我所看到的 我需要在 GitLab 端使用 ssh keygen 生成一个密钥并将其添加到我想要连接的服务器上 我可以在管道期间生成密钥 但由于公钥未添加到目标服务器
  • 如何防止自动工具自动重新生成配置脚本?

    有时由于SCM没有严格记住文件的时间戳 生成的Makefile会认为需要重新运行 autoreconf i 或相当于从Makefile am重新生成Makefile in 从configure ac重新生成配置等 我该如何防止这种情况 我想
  • 获得干净的 git 沙箱的最有效方法是什么?

    对于我的持续集成构建 我想确保我的 git 沙箱中没有存放任何杂散文件 并且没有任何文件被无意中更改 我知道关于git reset hard HEAD 这解决了部分问题 但我想我想做的是删除所有未跟踪和忽略的文件 我可以用蛮力的方式做到这一
  • Mac 操作系统屏幕上的 Git 自动补全

    我在 mac 上使用 git 并配置了自动完成功能 如下所示http www codethatmatters com 2010 01 git autocomplete in mac os x http www codethatmatters

随机推荐

  • 如何在 Redstone 拦截器中添加 CORS 标头?

    我正在尝试将 CORS 标头添加到传入请求中 但我注意到app response headers是一个不可变的映射并且app request response尽管它出现在文档示例中 但它并不存在 所以 对于OPTIONS我正在使用新的回复请
  • 添加滚动条到带有子图的图形

    我有一个 m 文件 应该在一张图中显示大约 20 个图像 所以现在我想知道如何向图中添加滚动条 目前 我的代码正在做这样的事情 figure Name Results for a 1 20 img result imread userinp
  • JavaScript 按单词断句

    将完整单词及其后续字符放入数组中的好策略是什么 Example 这是一句奇妙的话 Array 0 gt This 1 gt is 2 gt an 3 gt amazing 4 gt sentence 元素 0 3 将有一个后续空格 因为第
  • html 中隐藏输入的长度是否有最大大小?

    换句话说
  • 如何在 64 位进程中使用 32 位 COM 对象?

    我在 64 位机器上使用 Jacob JAVA COM Bridge 并希望从 32 位 DLL 加载 COM 对象 我怎样才能做到这一点 您需要在 32 位进程中托管 32 位 COM 对象 因此 要么您的整个应用程序必须运行 32 位
  • RFCOMM_CreateConnection - 已打开状态:2,RFC 状态:4,MCB 状态:5

    我正在编写一个 Android 应用程序 它使用 RFCOMM 通过蓝牙连接到设备 我使用 BluetoothChat 示例作为建立连接的基础 并且大多数时候一切都运行良好 但是 有时我无法重新连接 因为出现套接字已打开的消息 RFCOMM
  • 带日期的 Matplotlib - 更改每月数据的标签和刻度

    我有一个像这样的数据框 data list range 106 index pd period range 3 1 2004 12 1 2012 freq M df2 pd DataFrame data data index index c
  • Xcode 4.5 - 在我的设备上无线构建应用程序

    所以最近我的 iPhone 4 决定停止工作 我无法再使用 USB 将其连接到我的 Mac 或 PC 只有当我将它连接到墙上插座中的 USB 时它才会充电 并且我必须按下 30 针插入时连接器向上 但这是另一个问题 问题是我无法再在我的设备
  • 如何正确转换json数组?

    我对 vb net 有点生疏 我需要你的帮助来编码 monday start 09 00 end 18 00 breaks start 11 20 end 11 30 start 14 30 end 15 00 tuesday start
  • 如何将 Array[Seq[String]] 传递给 apache Spark udf? (错误:不适用)

    我在 scala 中有以下 apache Spark udf val myFunc udf userBias Float otherBiases Map Long Float userFactors Seq Float context Se
  • 当我尝试访问从数据库获取的对象的字段时出现 NoMethodError

    假设我有一个名为 Tweet 的模型 其中包含以下字段 1 id 2 内容 3 创建时间 4 用户id 5 original tweet id 现在假设我使用以下查询 tweet Tweet where id 64 查询此模型 并且此查询返
  • 如何一一连续加载URL

    我想一个接一个地加载URL 我使用字符串数组来存储URL 我的要求是 如果webview加载第一个url 它应该在页面启动时打印消息 页面开始 当页面完成时它应该显示 页面完成 第一个 URL 加载完成后 它应该加载第二个 URL 并继续相
  • 欧拉计划 8 - Haskell

    通过欧拉项目 我将我的解决方案与其他解决方案进行比较here 对于问题 8 我的代码生成了正确答案 通过网站上的校验和确认 23514624000 module Main where import Data List main do pri
  • 带有自签名证书的 VBA ServerXMLHTTP https 请求

    我正在使用 ServerXMLHTTP 对象对 excel 2007 vba 脚本发出一些 http 请求 但我需要连接到使用自签名 SSL 证书的 https 服务器 因此默认情况下我收到消息 证书颁发机构无效或不正确 有没有办法配置 S
  • 使用 C# 将 CSV 文件读入数组

    我正在尝试编写代码来引入 读取和分离 csv 文件 它有四列 没有标题 我已经在网上搜索了几个小时 但似乎没有人真正找到答案 所以我希望这里有人可以 读入后 我需要能够非常具体地拉出它 因为它是设计的一部分 提前致谢 你的问题有点模糊 但我
  • 重定向 Ascx 页面

    是否可以使用重定向 ascx 页面 Response Redirect 我的代码是 HttpContext Current Response Redirect postauthenticated employeereprintw2reque
  • 有什么好的 Winforms 向导库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个好的 Winforms 向导 库 所见即所得编辑器是首选 但不是必须的 你几乎必须扮演自己的角色 这并不难 我在 30 分钟内写了一篇
  • 在 React 构造函数中调用 super() 会做什么?

    学习Reactdocs并遇到了这个例子 class Square extends React Component constructor super this state value null 根据Mozilla super 允许您使用th
  • 从 IE 下载“签名已损坏或无效”

    我获得了 Certum 证书来签署我的 C 应用程序 一切似乎都正常 我可以执行该应用程序 并且还可以看到其上的有效证书 但是 如果我将其上传到我的网页 使用 Visual Studio 发布或同时上传 EXE 我无法在 Windows7
  • 如何恢复多个 Git 提交?

    我有一个 Git 存储库 如下所示 A lt B lt C lt D lt HEAD 我希望分支的头指向 A 即我希望 B C D 和 HEAD 消失 并且我希望 head 与 A 同义 听起来我可以尝试重新设置基准 不适用 因为我已经在两