2011-03-05 63 views
6

下面是这种情况:我可以恢复一个特定的提交,以使它在文件中保留未删除的内容吗?

-I提出了很多大大小小的修改,我的文件,并没有提交这些

-I决定使用和使用补丁命令的提交阶段部分

-I试图离开所有提交相关的,当我做到了

-I发现多次提交后,我不小心把在我应该在第一时间6犯前离开了变化,所以我恢复那个提交。

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

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

我知道我需要学习早期和经常做出承诺的习惯。我还没有掌握它,但是,因为当我只是在编码时,它喜欢打断我的思维。

我修正它的方式非常繁琐。有没有一种方法可以将文本保留在一个文件中,这个文件可以在恢复中被移除,就好像它是一个未分离的变化(有点像重置一样)?除此之外的任何建议?

回答

7

可以运行两次复归,上次申请--no-commit将留在指数准备改变犯:

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

的变化正在上演,并准备一个新的提交。要unstage运行:

git reset HEAD 
+2

你可以说'git revert --no-commit HEAD' for第二个(不需要知道它的提交ID)。 – 2011-03-05 10:14:07

+0

太棒了!谢谢。我应该考虑一下:)我会编辑它。 – asgerhallas 2011-03-05 16:06:48

+0

这是一个非常好的方法来取消对很多文件的提交,并且通常当不想指定文件时。谢谢。 – minozake 2011-03-05 18:49:36

0
git reset -p <COMMITHASH> 

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

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

+0

这有利于在一系列提交(可以是分布式的任何方式)多将恢复,但在这种情况下,我有一个特殊的复归来选择,因此这种方法是有点乏味通过工作,特别是如果我不得不手动编辑人群。无论如何,谢谢你的答案。 – minozake 2011-03-05 18:55:35

0

后恢复提交,你可以在反向还原适用于“unrevert”它只是在工作树:

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' 
2

你运行git revert BADCOMMIT你之后

git checkout HEAD^ -- filename 

...这应该更新的filename你的工作副本的状态复归提交前:可以在此之前,与提交特定文件恢复到它的状态。 (旧版本也将上演,所以如果你想取消它,请在git reset HEAD -- filename之后)。我认为没有更简单的方法。

+0

这帮了很大忙。我相信我会一直使用它,直到我学会了良好的承诺。 – minozake 2011-03-05 18:45:16

相关问题