【问题标题】:How to remove old problematic git commits如何删除旧的有问题的 git 提交
【发布时间】:2021-12-22 21:30:21
【问题描述】:

最近我们发现来自我们的一位前团队成员的两个旧 git 提交,这是恶意的并影响了我们的整个存储库。第一次提交从存储库中删除了所有文件,第二次提交将所有文件添加回存储库。因此,代码库没有任何变化,我们花了几天时间才注意到。

提交是几周前的,与此同时,我们有超过 100 次其他团队成员的新提交,并且不同分支之间有 10/15 次合并。现在是否可以从 git repo 中完全删除该提交?

我们想到的一个选项是变基,但由于合并和合并冲突,我们发现它非常困难。解决此问题的最佳行动方案应该是什么?

【问题讨论】:

  • 删除所有内容的提交,紧跟其后的提交还原所有内容,对使用存储库没有影响。你最好还是把它留在里面,前提是它确实可以恢复一切。
  • 要删除相邻的提交,请使用git replace,后跟git filter-branch 或git filter-repo。请注意,生成的存储库替换旧存储库:每个人都必须切换到使用新存储库并停止使用所有现有的克隆。这就是为什么最好把它留在里面。

标签: git git-rewrite-history


【解决方案1】:

由于您提到两次提交并未对代码库带来任何更改,您可以做一些简单的事情,例如从两次恶意提交之前的提交创建一个新分支,然后您可以挑选其余的来自主分支的历史。

假设您在main 上有一个如下所示的 git 历史记录:

6259e6d (master) Fifth commit
d96e3a7 Fourth commit
192ec1a Third commit # malicious commit 
254d6e0 Second commit # malicious commit
ed55fff First commit

那么你可以:

# 1. Identify the commit before the first malicious commit and create a branch off it
$ git branch clean_branch ed55fff

# 2. Checkout the new branch
$ git checkout clean_branch

# 3. Cherry-pick changes from the main branch
$ git cherry-pick d96e3a7^..6259e6d

新分支 (clean_branch) 的 git 历史记录现在将不包括您要删除的两个提交:

$ git log --oneline
a195fe0 Fifth commit
3e52330 Fourth commit
ed55fff First commit

你现在有一个历史清晰的分支;您现在可以将此分支设为新的main

【讨论】:

  • 这对我们来说也是一个潜在的解决方案。唯一的问题是在那之后有 100 多个提交。 Cherry 一个一个地挑选所有的 commit 会很烦人。您是否有解决方案使其自动化或批量处理?
  • @AliHasanImam 你只需要运行一次git cherry-pick;如我的回答所示,git cherry-pick 可以进行一系列提交
  • 抱歉,错过了那个。谢谢,会查的。
  • @AliHasanImam 酷,让我知道
猜你喜欢
  • 2018-10-18
  • 2023-02-08
  • 2022-07-03
  • 1970-01-01
  • 2011-01-14
  • 2013-10-16
  • 2016-05-27
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多