【问题标题】:How to remove a file from git repo on local and remote如何从本地和远程的 git repo 中删除文件
【发布时间】:2016-01-12 01:30:50
【问题描述】:

我希望我更了解 git。

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

在开始之前,我确保我的分支与遥控器完全是最新的。然后,我用了

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

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

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

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

【问题讨论】:

    标签: git local remote-access


    【解决方案1】:

    如果我正确理解您的问题,您将无法推送到远程存储库,因为您的本地历史记录与远程历史记录不匹配。当您使用 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

    【讨论】:

    • 所以,我告诉我的同事用遥控器更新他的版本。然后我用这个 --force 选项覆盖遥控器。然后他做了一个 git pull 来更新他的版本?
    • 我在我的 .gitignore 文件中添加了一些文件,并试图将它们从这个 repo 中删除。事实证明这很复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2013-05-20
    • 2014-08-18
    • 2012-02-21
    • 2020-10-31
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多