如何将部分更改从旧提交移动到工作目录?

时间:2017-11-15 15:02:54

标签: git

鉴于Git提交的历史和干净的工作目录,我想删除先前提交的一些更改,并将这些更改应用到我当前的工作目录中。为了澄清,在执行操作之后,应该修改旧提交以仅包含剩余的更改,并且将重写以下提交。我怎么能这么做最简单?

1 个答案:

答案 0 :(得分:0)

从干净的工作树我可能会这样做:

git cherry-pick -n old_commit # bring in all the changes

此时,您在工作树中进行了所有更改,但没有一个更改为提交。

git add -i

使用普通的git add -i interface

选择要保留的更改

此时您已完成要保留的所有更改。如果您想提交这些更改,那么:

git commit #commit staged changes
git reset --hard # remove changes that you didn't accept from your working tree

这可能会为您留下旧提交中添加的一些文件以及您选择不添加的文件。

或者,如果您只想在工作树中进行更改,但尚未暂存或已提交:

git commit # we will get rid of this commit shortly
git reset --hard # get rid of changes we didn't accept
git reset HEAD~1

git reset HEAD~1将更改索引状态,放弃我们刚刚提交的提交,并留下一个工作树,其中包含您决定保留的更改,但没有任何暂存,也没有新的提交。

这使旧提交保持原状。因此,在您跨分支或类似地移动更改的情况下,此答案非常有用。也就是说,HEAD中不需要进行更改。如果HEAD从未包含这些更改或者您已将其还原,则会发生这种情况。 改变旧的提交是不可能的; Git提交无法更改。可以生成备用历史记录,其中与旧提交相对应的提交没有在当前历史记录中具有的某些更改。这是一个不同的问题,所以我没有在这里回答。