Git:从分支中删除单个文件,同时将其保留在项目中

Git:从分支中删除单个文件,同时将其保留在项目中,git,Git,在某个时候,我一定编辑了一个与我正在处理的分支(问题)无关的文件。我不小心把它推到Github,在创建拉请求时看到了它 我想从我的分支中删除该文件,但不想从项目中删除-即:我不能删除该文件并将其作为提交推送 我试过: git重置头^path/file.ext 但是没有运气(没有发生任何事情-没有错误,文件也没有恢复) 有人知道正确的方法吗?如果它不是敏感文件,您可以删除它并推送新提交 git rm that_file git commit git push 该文件仍将出现在历史记录中,但不会出

在某个时候,我一定编辑了一个与我正在处理的分支(问题)无关的文件。我不小心把它推到Github,在创建拉请求时看到了它

我想从我的分支中删除该文件,但不想从项目中删除-即:我不能删除该文件并将其作为提交推送

我试过:

git重置头^path/file.ext

但是没有运气(没有发生任何事情-没有错误,文件也没有恢复)


有人知道正确的方法吗?

如果它不是敏感文件,您可以删除它并推送新提交

git rm that_file
git commit
git push
该文件仍将出现在历史记录中,但不会出现在最终合并中

如果它是一个敏感文件,比如里面有密码或个人信息。或者,如果您只是想提供一个更清晰的历史记录,您可以使用
git-rebase-i master
(或您分支的任何分支)将其从历史记录中删除。这将使您有机会重写意外包含该文件的提交。重写提交,然后
gitpush--force
向上发送新版本的分支历史记录


我不想详细介绍,而是让您参考。

这个文件上有多少个提交?最简单的方法是从master重新设置基础并编辑这些提交,如下所示:

git rebase -i master
# find the relevant commits and use `edit` instead of `pick`
git reset --soft HEAD~1 -- file # makes the changed file staged to be commit (but we don't want that)
git checkout -- file # revert the changes staged again in the previous command
git commit --amend
git rebase --continue
git push --force origin <your-branch-name>
git-rebase-i主机
#查找相关提交并使用“编辑”而不是“拾取”`
git reset--soft HEAD~1--file#将更改后的文件暂存为提交(但我们不希望这样)
git checkout——文件#恢复上一个命令中再次进行的更改
修改最后一次提交
git rebase--继续吗
git push——力的来源

您现在应该拥有一个干净的提交历史记录,而不需要对特定文件进行任何更改。

从听起来的情况来看,您基本上希望删除合并请求中对文件的所有更改。首先要做的是签出文件的干净副本并将其添加到分支中

git checkout master -- <the file>
git签出主机--
现在提交这些更改并将新的提交推送到远程服务器。拉动请求应更新为不再具有对此文件的更改


如果您是唯一使用该分支的人,那么您可以重新设置提交的基础,以便最新的提交不再出现在您的历史记录中(但这真的不是什么大问题)。为此,您将
git-rebase-i master
,选择“挤压”提交。为了更新pull请求中的提交,您需要执行
git push-f
。这样新提交的内容就会覆盖旧提交的内容。此步骤是完全可选的。

是的,您可以从该分支删除该文件。除非合并分支,否则它不会影响项目的其余部分。@Schwern但我确实希望最终合并分支。它会不会在我的提交中显示为已删除的文件?是的,但不会在最终合并中显示。所以,除非它是敏感的,否则没什么大不了的。@Schwern这就是我对git的了解减弱的地方:通过发出一个文件已被删除的信号,在将来的合并中,它不会被标记为已删除的文件吗?这不是“修改”文件的一种形式吗?通常来说,分支中的文件是如何更改的并不重要。对于合并来说,最重要的是分支顶端的所有东西都是什么样子。这就是为什么人们说Git“跟踪内容”,而不是“跟踪更改”或“跟踪增量”。从概念上讲,Git中的每个提交都是文件的完整状态。事情如何变化的历史就是:历史。因此,如果你在一个分支中添加一个文件,然后在同一个分支中删除它,就合并而言,它根本不存在。是的!谢谢对不起,我可能应该这样回答我的问题