我可以还原一个特定的提交,使其在文件中保留未删除的内容吗?

时间:2011-03-05 06:22:33

标签: git

以下是该方案:

- 我对我的文件进行了很多小的和大的修改,并没有提交它们

- 我决定使用git commit --interactive并使用patch命令暂存部分提交

- 当我这样做时,我试图让所有提交都相关

- 我在多次提交后发现我意外地进行了一次更改,我本来应该在第一次发布6次提交时遗漏,所以我还原了那次提交。

- 恢复删除了文件中相关的文本,这是预期的行为。

最后一步是我要修改的那一步。我想要做的是恢复提交,但将文本保留在文件中,以便我可以重新提交提交。我的方法是在恢复提交之前将HEAD区分到提交,然后我复制并粘贴文本并对其进行修改以使其不是diff格式,因此我可以在文件中使用它,然后将其提交正常。

我确实意识到我需要学习早期和经常做事的习惯。我还没有掌握它,因为它只是在我编写代码时想要打断我的心态。

我修复它的方式很乏味。有没有办法将文本保留在一个文件中,该文件将在恢复中删除,就好像它是一个未分级的更改(有点像重置一样)?除此之外的任何建议?

4 个答案:

答案 0 :(得分:7)

您可以运行两次恢复,最后一次应用--no-commit,这将使索引中的更改准备好提交:

git revert <the commit you want back in the working tree>
git revert HEAD --no-commit

现在已经进行了更改并准备好进行新的提交。要取消暂停运行:

git reset HEAD

答案 1 :(得分:2)

运行git revert BADCOMMIT后,您可以将特定文件恢复到该提交之前的状态:

git checkout HEAD^ -- filename

...应该在恢复提交之前将filename的工作副本更新为其状态。 (旧版本也将上演,所以如果你想取消它,那么之后再做git reset HEAD -- filename。)我认为没有更简单的方法。

答案 2 :(得分:0)

 git reset -p <COMMITHASH>

这将提示您将补丁重新应用到索引。

请记住,这将选择从您提到的提交到索引的更改,这意味着它将尝试(反向)将所有前6次提交应用于索引。您只需选择要删除的更改。

答案 3 :(得分:0)

在您恢复提交后,您可以反向应用还原以仅在工作树中“还原”它:

git revert C &&                   # you already did this part
git show HEAD | git apply -R

默认情况下,git apply仅修补工作树。它还具有仅修补索引或索引和工作树的选项。因此,您可以使用git revert而不是使用git apply来将更改反向应用于索引,然后提交(所有这些都不会触及工作树):

# assumption: we start with no staged changes, and have not reverted anything yet

# revert C directly in the index (does not touch the working tree), then commit
git show C | git apply --cached -R &&
git commit --edit -m'Reverted C'