如何修改上一次提交以取消添加文件?


108

我已经修改了两个文件ab在最后提交。但是b不应该提交文件,对此进行修改的工作流程是什么?

Answers:


109

更新(几年后)

扬·胡德克(Jan Hudec)

仅将其从索引中删除很简单。

正确:您可以很容易地将文件重置为其索引内容,正如最近的回答(由Matt Connolly编写)所建议的那样:

git reset HEAD^ path/to/file/to/revert

HEAD^允许文件在上一次提交之前访问上一次提交中的内容。

然后,可以git commit --amend像我最初在下面写的那样。


在Git 2.23(2019年8月)中,您可以使用新git restore命令

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

较短:

 git restore -s@^ -S -- path/to/file/to/revert

同样,您可以git commit --amend按照我最初在下面的内容进行操作。


原始答案(2011年1月)

如果这是您的最后一次提交(并且尚未将其推送到任何地方),则可以对其进行修改:(
第一次存储或保存b

 git commit --amend

然后删除b,重新提交。还原b,您就完成了。

--amend

用于修改当前分支的尖端。
像往常一样准备要替换最新提交的树对象(这包括常用的-i / -o和显式路径),并且提交日志编辑器中包含来自当前分支尖端的提交消息。
您创建的提交将替换当前提示(如果是合并,则它将当前提示的父级作为父提示),因此当前的顶级提交将被丢弃。


... Then stash/delete b, re-commit..,这个词不应该Thenafter吗?- --amend后STACH /删除B,...
谢Jìléi

@谢继雷:换句话说,先保存b,然后提交--amend,然后还原?真正。我已经更新了答案。
VonC

借助git index的强大功能,告诉任何人隐藏/保存文件只是愚蠢的(-1)。仅将其从索引中删除很简单。
Jan Hudec 2014年

1
@JanHudec是的,我已经相应地编辑了答案。我没有像在Stack Overflow上那样紧密地遵循这个旧答案。无论如何,关于SU的git问题的99%都应该在SO上迁移。
VonC 2014年

66
  1. git diff --name-only HEAD^ -(可选)用于列出上次提交中更改的文件。
  2. git reset HEAD^ path/to/file/to/revert-将索引重置为该最新版本,而保持工作副本不变。
  3. git commit --amend-修改最后一次提交以包括索引更改

9
恕我直言,这是一个比公认的更好的答案。
mik01aj 2013年

1
请注意,您不应该git commit -a --amend在第3步中使用(即不添加文件),否则您将提交工作副本更改,这些更改就是您要删除的编辑。可选步骤2.5也可以git checkout path/to/file/to/revert是清理工作副本。
dmnd

1
git rm --cached path/to/file/to/revert可以取消添加文件而不将其从树中删除。
2014年

13

或者,如果使用git gui,则只需选择“修改上一次提交”选项,添加的文件将显示在“分段”列表中,单击其图标将其移至“未分段”列表并进行提交。


1
@VonC:对于大量的git用户来说,编辑和拆分补丁是很常见的操作,因此gui的设计使其简单易行,并且是IMO的最佳工具。
2014年

那个工程!对于该特定任务,我没有其他选择的成功。谢谢你的提示!
Serguzest

10

如果您想从上一次提交中删除b

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

如果要删除上一次提交中对b的所有更改

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cached并取消备份/还原舞蹈(-1)。
Jan Hudec 2014年

感谢您指出了这一点。我想分享一下我是如何做到的,因为即使在阅读了整个主题之后,这也是我最满意的方法。
pingo 2014年

4

不需要索引黑客,但仍然保留旧的提交消息的替代方法:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

我喜欢这样,因为(a)它使用我经常使用的命令,并且(b)我可以git add -p确切地确定我要提交的命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.