如何从最新提交中删除文件?


当前回答

我将用例子向你解释。设A、B、C为3次连续提交。提交B包含一个不应提交的文件。

git log  # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>    

其他回答

如果出于任何原因(就像我的情况一样),您在重新设置上次提交的所有文件时遇到困难,如git reset--soft HEAD^,并且您的情况满足以下条件,您可以按照我下面的解释进行操作。

您试图删除的文件在上次提交之前已存在于存储库中您可以撤消自上次提交以来文件中的所有更改(HEAD~2-上次提交之前的提交)

然后,您可以撤消自上一次提交(HEAD~2)以来的所有更改,保存文件,将其暂存(git-add文件名),然后运行gitcommit--modify--no edit。这将提交“新的更改”,这实际上是将文件重新提交到上次提交之前的最后一次提交。

现有的答案都是关于从上次提交中删除不需要的文件。

如果您想从旧提交(甚至推送)中删除不需要的文件,并且不想创建新提交,这是不必要的,因为执行以下操作:

使用查找您希望文件符合的提交;

git-log--图形--装饰--单行

使用签出提交

git checkout<commit_id><path_to_file>

如果要删除许多文件,可以多次执行此操作。

3.

gitcommit-am“删除不需要的文件”

4.

查找错误添加文件的提交的commit_id,让我们在这里说“35c23c2”

git rebase 35c23c2~1-i//注意:“~1”是必需的

此命令根据您的设置打开编辑器。默认值为vim。如果要更改全局git编辑器,请使用;

git-config--全局core.editor<editor_name>

5.

将最后一次提交(应该是“删除不需要的文件”)移动到错误提交的下一行(在我们的例子中是“35c23c2”),并将命令设置为fixup:

pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files

保存文件后你应该很好。

6.

要完成:

git push-f

如果不幸发生冲突,则必须手动解决。

git reset --soft HEAD~1. 

这将撤消本地回购中的最后一次提交,并将所有内容移回提交前的阶段区域。然后,只需正常使用任何Git UI工具(如TortoiseGit、Git UI、Git Extensions…)来取消我们不想提交的文件的页面,然后再次提交。

现在,苹果已经将所有MacOS用户更新为zsh,正确的答案不再有效。

git reset --soft HEAD^
zsh: no matches found: HEAD^

您可以通过单引号防止shell将^视为特殊字符。

git reset --soft 'HEAD^'

或者,您可以在shell中禁用此行为。通过更新~/.zshrc

unsetopt nomatch

我认为这里的其他答案是错误的,因为这是一个将错误提交的文件从上一次提交移回临时区域的问题,而不取消对它们所做的更改。这可以像Pariosh Singh建议的那样:

git reset --soft HEAD^ 

or

git reset --soft HEAD~1

然后重置不需要的文件,以便将它们从提交中删除(旧方法):

git reset HEAD path/to/unwanted_file

注意,自从Git 2.23.0以来,人们可以(以新的方式):

git restore --staged path/to/unwanted_file

现在再次提交,您甚至可以重复使用相同的提交消息:

git commit -c ORIG_HEAD