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


当前回答

如果您想保留提交(可能您已经花了一些时间编写了详细的提交消息,不想丢失它),并且您只想从提交中删除文件,而不是完全从存储库中删除文件:

git checkout origin/<remote-branch> <filename>
git commit --amend

其他回答

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

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

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

git reset --soft 'HEAD^'

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

unsetopt nomatch

注意!如果您只想从上一次提交中删除一个文件,并将其保存在磁盘上,请阅读上面juzzlin的回答。

如果这是您最后一次提交,并且您希望从本地和远程存储库中完全删除该文件,您可以:

删除文件git-rm<file>带有修正标志的commit:gitcommit--修正

修正标志告诉git再次提交,但“合并”(不是合并两个分支的意思)这次提交与最后一次提交。

如注释中所述,在这里使用gitrm就像使用rm命令本身一样!

如果尚未在服务器上推送更改,则可以使用

git reset --soft HEAD~1

它将重置所有更改并恢复为一次提交

如果您已经推动了更改,请按照@CharlesB回答的步骤操作

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

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

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

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

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

使用rm删除文件将删除它!

您总是在git中添加提交,而不是删除,因此在本例中,将文件返回到第一次提交之前的状态(如果文件是新的,这可能是删除“rm”操作),然后重新提交,文件将继续。

要将文件恢复到以前的状态,请执行以下操作:

    git checkout <commit_id> <path_to_file>

或者将其返回到远程HEAD的状态:

    git checkout origin/master <path_to_file>

然后修改提交,您应该会发现文件已从列表中消失(并且没有从磁盘中删除!)