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

Xiè*_*léi 121 git

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

Von*_*onC 118

更新(几年后)

扬·胡德克

仅从索引中删除它是微不足道的。

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

git reset HEAD^ path/to/file/to/revert
Run Code Online (Sandbox Code Playgroud)

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

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


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

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert
Run Code Online (Sandbox Code Playgroud)

更短:

 git restore -s@^ -S -- path/to/file/to/revert
Run Code Online (Sandbox Code Playgroud)

同样,你可以git commit --amend,正如我最初在下面写的那样。


原始答案(2011 年 1 月)

如果这是您的最后一次提交(并且您没有将其推送到任何地方),您可以修改它:
(first stash 或 save b

 git commit --amend
Run Code Online (Sandbox Code Playgroud)

然后删除b,重新提交。恢复 b 就完成了。

--amend
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*lly 71

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

  • 恕我直言,这是一个比公认的更好的答案。 (9认同)

Jan*_*dec 13

或者,如果您正在使用git gui,您只需选择“修改上次提交”选项,添加的文件出现在“暂存”列表中,单击它的图标将其移动到“未暂存”列表并提交。


pin*_*ngo 10

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

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

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

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)
Run Code Online (Sandbox Code Playgroud)


Jus*_* L. 6

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

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

我喜欢这个是因为 (a) 它使用我经常使用的命令,并且 (b) 我可以做git add -p来确切地弄清楚我想要提交什么。