如何将 Git 中的某个早期提交记录更新到最新代码版本?

3

我试图撤销一个已经推送到远程的非常旧的提交记录。 我搜索了一下,认为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,但仍然出现合并冲突。

5
你需要的是 git filter-branch 或其他第三方工具来从整个历史记录中删除文件。这里有一个链接可以帮助你:https://docs.github.com/cn/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository 。 - ElpieKay
提交做了什么?它只是添加了不需要的文件,还是有其他更改?如果是后者,则您不想放弃提交,而是编辑它,使其不再添加不需要的文件。 - j6t
@j6t 它还会在 .env 文件中添加一行指向凭据文件的内容,但仅此而已。 - The Blind Hawk
我知道手册中有一个叫做 --rebase-merges 的选项(以及其他合并选项)。但我自己从未使用过它。不确定它的效果如何。你尝试在你的变基命令中添加这个选项了吗?编辑:算了吧。它说“任何已解决的合并冲突或手动修改都必须手动解决/重新应用。” :( 我想你每次可以使用 git checkout REBASE_HEAD -- <conflict files> 来解决,但那仍然很麻烦。 - Jay
请务必更改凭据。 - Adam
1个回答

2

感谢@ElpieKay的帮助!
git filter-repo成功完成了其工作。
有关详细信息,请查看此处
我最初尝试使用BFG,但遇到了一些问题,所以我转而使用了git filter-repo

  1. 我确保已经推送了所有本地提交。
  2. 我安装了git filter-repo
brew install git-filter-repo
  1. 我克隆了一个新的本地仓库 (git clone)。 这一步是因为git-filter-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"

新克隆的代码库没有源。请添加它。
git remote add origin <your-repo-clone-url>
  1. 强制推送到远程仓库
git push origin --force --all

最后,请要求在其他本地存储库中的所有其他旧分支上运行rebase。
git checkout <the-branch-cut-from-the-old-main>
git rebase origin main

这样就可以了!祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接