2014-01-30 53 views
6

当我在交互式rebase期间分裂提交时,我经常想从最后一次提交中提取特定文件。如何“git reset --soft HEAD ^”单个文件?

我目前的进程是

  1. 复制的最后提交信息到我的剪贴板,
  2. git的复位--soft HEAD ^(最后提交破灭,变化都在上演)
  3. Unstage文件,我想提取
  4. 重新提交(粘贴复制的提交信息中)
  5. 添加/提交剩余的文件
  6. 继续与底垫

我觉得这样会更简单,如果我可以软重置一个特定的文件。

回答

8

您想要做git checkout $COMMIT_HASH some_file.ext

你可以用它来恢复一个文件到它以前的状态,并且git可以处理这个改变。

+0

这与'git commit --amend'组合会让我在中途停下来,除了更改本身丢失。 简而言之,我希望将更改从先前的提交中分离出来,而不必重置整个提交。 – Rhinon

+1

不,检出单个文件不会消除其他更改。它只是恢复一个文件。 – mellowfish

+0

唯一明显的问题(?)是'git checkout'触及工作树,而'git reset $ commit - $ path'没有。 – kostix

5

看来这你想要做什么:

git reset [-q] [commit] [--] paths…这种形式重置指数 条目都paths他们的状态在commit。 (它不会影响工作树 ,也不会影响当前分支。)

这意味着git reset与git add相反。

+0

应该补充说,这个('git reset-path')步骤是在'git reset --soft HEAD ^'之后完成的。这里的想法是在'索引'或工作树中'HEAD'返回一个提交而不改变*任何东西*,然后使用新的退后“HEAD”对索引进行一次更改(而不是工作树) 。 – torek

相关问题