从 Git 提交中删除文件

我正在使用 Git,并且已经使用了一些文件

git commit -a

后来,我发现一个文件被错误地添加到提交中。

如何从上一次提交中删除文件?

答案

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

git reset --soft HEAD^

要么

git reset --soft HEAD~1

然后重置不需要的文件,以使其脱离提交:

git reset HEAD path/to/unwanted_file

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

git commit -c ORIG_HEAD

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

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

  1. 删除文件git rm <file>
  2. 使用修改标志git commit --amendgit commit --amend

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

如评论中所述,在这里使用git rm就像使用rm命令本身一样!

现有的答案都在谈论从上一次提交中删除不需要的文件。

如果要从提交(甚至推送)中删除不需要的文件,并且不想创建新提交,则由于该操作,这是不必要的:

1。

查找您要文件符合的提交。

git checkout <commit_id> <path_to_file>

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

2。

git commit -am "remove unwanted files"

3。

找到错误添加了文件的提交的 commit_id,在这里说 “35c23c2”

git rebase 35c23c2~1 -i  // notice: "~1" is necessary

该命令根据您的设置打开编辑器。默认值是 vim。

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

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

保存文件后应该会很好。

完成 :

git push -f

如果不幸遇到冲突,则必须手动解决。

如已接受的答案所示,您可以通过重置整个提交来做到这一点。但这是一个相当繁重的做法。
一种更清洁的方法是保留提交,然后从中删除更改的文件。

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

git reset将按上次提交时的方式获取文件,并将其git reset于索引中。工作目录中的文件未更改。
然后git commit将提交并将索引压缩到当前提交中。

本质上,这将获取上一次提交中文件的版本,并将其添加到当前提交中。这不会导致任何净变化,因此可以有效地将文件从提交中删除。

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

git reset --soft HEAD~1

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

如果您已推送更改,请按照 @CharlesB 回答的步骤进行操作

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

您总是在 git 中添加提交而不是删除,因此在这种情况下,将文件返回到第一次提交之前的状态(如果是新文件,这可能是删除'rm' 动作),然后重新提交,文件将消失。

要将文件恢复到以前的状态:

git checkout <commit_id> <path_to_file>

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

git checkout origin/master <path_to_file>

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

git checkout HEAD~ path/to/file
git commit --amend

以下内容将仅取消暂存您想要的文件,这是 OP 要求的。

git reset HEAD^ /path/to/file

您会看到类似以下的内容...

要提交的更改:(使用 “git reset HEAD ...” 取消登台)

修改:/ path / to / file

未进行提交的更改:(使用 “git add ...” 更新将提交的内容)(使用 “git checkout-...” 放弃工作目录中的更改)

修改:/ path / to / file

  • “要提交的更改” 是提交之前文件的先前版本。如果文件从不存在,则看起来像是删除。如果您提交此更改,则将有一个修订版本,可将更改还原到分支中的文件。
  • “未暂存的更改未提交” 是您已提交的更改以及文件的当前状态

此时,您可以对文件执行任何操作,例如重置为其他版本。

准备提交时:

git commit --amend -a

或(如果您正在进行其他更改,但还不想提交)

git commit add /path/to/file
git commit --amend

我将通过示例向您解释。
令 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 rm --cached path_to_file

确保使用--cached否则您的文件也将从项目中删除。