git - 删除 git/github 提交历史(以前的),同时保持最新的提交
问题描述
我目前正在进行一个名为“3”的提交(比如说)。以前我有名为“2”、“1”的提交。无意中,我在提交“2”时添加了一些密钥。然后我从我的工作区中删除了该文件,然后以名称“3”提交。如何在保留最新提交“3”的同时从 git 和 github 历史记录中删除提交“2”。我只想拥有提交“3”时存在的所有文件/更改,并且我的最后一次提交为“1”。
我在这里和那里搜索并找到了关于rebase
,reflog
但无法清楚地了解如何解决这个特定问题。
已编辑。我把他们三个都推到了github。
解决方案
如果你还没有推送,并且你也确定你不想要第二次提交中的任何东西,那么交互式 rebase 就会派上用场:
# from your branch
git rebase -i HEAD~3
这将打开一个屏幕,显示最近 3 次提交,从最旧到最新:
pick d83pcnd commit 1
pick 3jsu83m commit 2
pick w2kx9wk commit 3
从编辑器中,只需删除第二次提交的行,留下:
pick d83pcnd commit 1
pick w2kx9wk commit 3
现在退出编辑器并保存,这应该会自动启动 rebase。由于第三次提交的工作在第一次提交之上重放,您可能会遇到合并冲突。
请注意,由于在此假设下,您还没有从第二次提交开始推送,您可以只进行常规推送:
# from your branch
git push origin your_branch
现在是棘手的部分。如果您已经将第二次提交推送到远程,那么您仍然可以执行上述步骤,但在最后执行强制推送。 但是,请记住,其他人可能已经看到了密钥。所以,如果你已经推了,那猫就从袋子里出来了,你可能应该重新生成钥匙。
推荐阅读
- maven - 为什么从github克隆MAVEN的源代码却发现缺少一些类文件
- python - 从 pandas DataFrame 中的日期时间列中提取月份
- bash - Bash 脚本将无整数变量转换为整数
- c# - 如何在 NUnit C# 中只运行一次该方法
- java - 使用junit5 + springboot 2.5.4进行单元测试
- c - 由于 scanf 功能,我的代码花费了很多时间,之后它甚至没有运行
- node.js - 多个查找阶段,展开和匹配,并根据查找阶段的字段显示反应(但该字段存在于所有查找阶段)
- r - 我应该如何在 R 上为 SQL 循环 INSERT INTO 语句?
- java - 如何使用@DataSourceDefinition
- mysql - 在 docker 中为 keycloak 配置远程 MySQL 服务器