git rebase 真正的旧提交

git rebase really old commit

我正在尝试撤消已经推送到远程的非常旧的提交。 我环顾四周,认为 git rebase 可能是最好的解决方案。 所以我 运行 代码:

git rebase -i <commit-id>

然后编辑:

pick <commit-id> <commit-title>
drop <commit-id> <commit-title>   <- the commit I want to delete
pick <commit-id> <commit-title>

然后尝试将此应用到 :wq。然而,这引发了很多合并冲突(提交大约半年)。

我想撤消提交的原因是因为我不小心添加了一个带有凭据的文件,我不应该与其他协作者共享。
所以我唯一想撤消的是远程文件的“创建”。

git rebase 是最好的方法吗?
如果是这样,有没有办法不触发所有合并冲突(像以前一样合并它们)?
我宁愿不小心以错误的方式合并冲突。

此外,我尝试删除的提交不应与未来的提交发生任何冲突。我尝试 运行 git rebase 没有放弃提交,但合并冲突仍然弹出。

感谢@ElpieKay!
git filter-repo 设法完成了它的工作 有关完整详细信息,请查看 here
我首先尝试使用 BFG,但我遇到了一些问题,所以我继续使用 git filter-repo

  1. 我确定我已经推送了所有本地提交。
  2. 我安装了git filter-repo
brew install git-filter-repo
  1. 我克隆了一个新的本地存储库 (git clone)。
    这一步是因为 git-filter-repo 提醒 运行 新克隆的 repo 中的命令。
  2. 删除凭据文件并将其添加到 .gitignore。 如果您还没有保存凭据,请确保将其保存在其他地方。
git filter-repo --invert-paths --path PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "deleted file <file-name> and added to .gitignore"
  1. 新克隆的回购将没有来源。添加它。
git remote add origin <your-repo-clone-url>
  1. 强制推送到原点
git push origin --force --all
  1. 最后要求 运行 对其他本地存储库中的所有其他旧分支进行 rebase。
git checkout <the-branch-cut-from-the-old-main>
git rebase origin main

这应该可以解决问题!祝你好运!