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

时间:2017-02-16 02:08:02

标签: git

在某些时候,我必须编辑一个与我正在处理的分支(问题)无关的文件。我不小心把它推到Github并在我创建一个Pull Request时看到了它。

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

我试过了:

git reset HEAD^ path/file.ext

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

有人知道正确的解决方法吗?

3 个答案:

答案 0 :(得分:3)

从听起来,您基本上想要删除合并请求中文件的所有更改。要做的第一件事就是检查文件的干净副本并将其添加到您的分支。

git checkout master -- <the file>

现在提交这些更改并将新提交推送到您的远程。应该更新pull请求以不再对此文件进行更改。

如果您是唯一使用该分支的人,您可以重新提交您的提交,以便最近的提交不再在您的历史记录中(但它确实不是一件大事)。为此,你会git rebase -i master,选择&#34;壁球&#34;提交。要更新pull请求中的提交,您需要执行git push -f <your branch>。这样新的提交就会覆盖旧的提交。此步骤完全是可选的。

答案 1 :(得分:1)

这个单独的文件有多少次提交?最简单的方法是从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>

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

答案 2 :(得分:0)

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

git rm that_file
git commit
git push

该文件仍将保留在历史记录中,但不会出现在最终合并中。

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

我会将您推荐给Rewriting History chapter of Pro Git

,而不是详细介绍