如何使用“git reset --soft HEAD^”重置单个文件?

13
在交互式变基过程中,当我要拆分提交时,常常需要从最后一次提交中提取特定的文件。
我的当前流程是:
  1. 将最后一次提交消息复制到剪贴板中,
  2. git reset --soft HEAD^(取消上次提交,更改被暂存),
  3. 取消暂存我想提取的文件,
  4. 重新提交(粘贴复制的提交消息),
  5. 添加/提交其余的文件,
  6. 继续进行变基。
我认为,如果我可以软重置一个特定的文件,这将会更简单。
4个回答

13

您是否正在尝试执行 git checkout $COMMIT_HASH some_file.ext

您可以使用此命令将文件还原为其以前的状态,并且git将会在这个更改中暂存该文件。


这个与 git commit --amend 结合使用可以让我完成一半,但是更改本身会丢失。简而言之,我想将更改从先前的提交中拆分出来,而无需重置整个提交。 - Rhinon
2
不,检出单个文件不会清除您的其他更改。它只会还原那个文件。 - mellowfish
唯一明显的问题是,git checkout 会触及工作树而 git reset $commit -- $path 则不会。 - kostix

9

看起来这符合你的需求:

git reset [-q] [commit] [--] paths… 这种形式将 paths 的索引项重置为它们在 commit 时的状态。 (它不影响工作树,也不影响当前分支。)

这意味着 git reset 是 git add . 的相反操作。


应该补充说明的是,在执行 git reset --soft HEAD^ 后,应该再执行 git reset -- path 步骤。这里的想法是将 HEAD 向后移动一个提交,而不改变索引或工作树中的任何内容,然后使用新的、向后移动的 HEAD 对索引进行一次更改(但不包括工作树)。 - torek

0

一个简单的方法可以是

  1. 添加所有文件

    git add .

  2. 现在重置您不想提交的文件

    git reset 'file1.ext' git reset 'file2.ext' ... 等等

  3. 继续您的提交和推送


0

我不确定这是否是最优解决方案。

git reset HEAD~
git add .
git commit
(optional) git reset --hard HEAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接