如何从本地和远程的 git 存储库中删除文件

How to remove a file from git repo on local and remote

我希望我更了解 git。

我的存储库中有一些项目设置文件在我们每次提交项目时都与同事的冲突。不完全确定为什么,但由于它们产生的噪音,是时候从存储库中删除这些文件了。我无法让它发挥作用来挽救我的生命。

在开始之前,我确保我的分支完全与远程同步。然后,我用了

 git filter-branch -f --index-filter \ 'git rm -r --cached --ignore-unmatch *.csproj' HEAD

由于备份存在一些问题,我添加了 -f 标志,因为我已经 运行 这几次了。

运行 这个命令似乎从我的仓库中删除了所有文件。但是,当我尝试将此更改推送到服务器时,它给出了一个错误,指出我的回购是远程版本之后的 2 次提交。它建议我拉,然后撤消上面的命令。

我缺少什么才能将此更改上传到我的服务器? (比特桶)

如果我理解你的问题是正确的,你不能推送到远程存储库,因为你的本地历史记录与远程历史记录不匹配。当您使用 rebasefilter branch.

在本地更改命中提交时通常会发生这种情况

如果将本地更改推送到远程,您将重写项目的部分或全部历史记录。这意味着您项目中的每个开发人员在尝试 git pull 时都会遇到障碍,因为现在 他们的 本地历史与远程历史不同。在这种情况下,您通常希望将这种情况告知您的合作开发人员,因为如果他们不知道您的 filter-branch 做了什么,这可能会非常混乱并且耗时。

话虽如此,我相信您正在寻找 git push--force 选项。你要运行git push --force origin master。顾名思义,这将用本地 git 历史覆盖远程中的任何内容。

请在执行此操作之前阅读 the docs,如果您有任何问题,请提出更多问题,因为这样做可能具有破坏性。

编辑: 我知道您的同事有两种选择。他们可以选择 fetch/reset 路线或 rebase 路线。

fetch/reset 路线需要将您同事的本地存储库重置为与远程存储库完全一样。这可以通过以下方式完成:

git fetch origin && git checkout master
git reset --hard origin/master

rebase 路线需要将您同事的本地提交应用到新清理的 master 之上。在交互模式下,他们将有机会在包含之前检查每个提交。如果提交包含您想要删除的文件,他们可以简单地忽略它。这可以用

来完成

git 获取 git rebase -i origin/master

如果你们都同意您的存储库应该是规范的存储库,那么第一个选项会更好,因为它更快。第二种方法反过来为您提供更细粒度的控制。

您可以查看这个 SO 问题,它更彻底地解决了力推后拉的问题:git pull after forced update