以下是该方案:
- 我对我的文件进行了很多小的和大的修改,并没有提交它们
- 我决定使用git commit --interactive
并使用patch命令暂存部分提交
- 当我这样做时,我试图让所有提交都相关
- 我在多次提交后发现我意外地进行了一次更改,我本来应该在第一次发布6次提交时遗漏,所以我还原了那次提交。
- 恢复删除了文件中相关的文本,这是预期的行为。
最后一步是我要修改的那一步。我想要做的是恢复提交,但将文本保留在文件中,以便我可以重新提交提交。我的方法是在恢复提交之前将HEAD区分到提交,然后我复制并粘贴文本并对其进行修改以使其不是diff格式,因此我可以在文件中使用它,然后将其提交正常。
我确实意识到我需要学习早期和经常做事的习惯。我还没有掌握它,因为它只是在我编写代码时想要打断我的心态。
我修复它的方式很乏味。有没有办法将文本保留在一个文件中,该文件将在恢复中删除,就好像它是一个未分级的更改(有点像重置一样)?除此之外的任何建议?
答案 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'