有没有办法软恢复'旧的提交?

时间:2016-06-14 21:52:44

标签: git git-revert

有没有办法在不更改工作目录中的文件的情况下还原旧提交? 我做了一段时间的提交,但我提交的代码还没准备好,我希望这些更改作为未提交的更改保留在我的工作目录中,以便我现在可以继续处理它们。 我查看了revert命令但更改了工作目录。 我正在考虑检查旧版本,重置头1并存储更改,但我已经有了更改。我只是希望它好像我从来没有做过那样的提交方式,但我希望保留对文件的更改。

4 个答案:

答案 0 :(得分:6)

您可以执行类似

的操作
git revert hash_of_your_commit
git reset HEAD^

之后,您将对已还原的提交进行非暂停更改。

答案 1 :(得分:2)

简短的回答是" no"。

答案较长:git revert - 与所有面向合并的操作一样,包括git cherry-pickgit rebase,当然还有git merge本身 - 修改可修改的工作树,使用索引。您可以提交或存储当前的工作,或获取第二个工作树(使用另一个克隆,或者如果您使用的是Git 2.5或更高版本,则使用git worktree。)

你可以使用git revert -n,它允许工作树变脏,但我不会在这里提出建议。

我处理此问题的方法是立即提交:

$ git add ...
$ git commit -m 'temporary commit, do not push'

然后,将所需的还原作为常规提交执行:

$ git revert <hash>

然后使用git rebase -i交换新还原提交和临时提交的顺序:

$ git rebase -i HEAD~2  # and edit the two "pick" lines

然后使用git reset --soft HEAD^(或HEAD~1,同样的事情)或git reset --mixed HEAD^来取消提交临时提交。此时,您处于与进行临时提交之前相同的状态(大部分)。

(主要)与索引状态有关:如果使用git reset --soft,则所有git add现在都有效。如果您使用git reset --mixed,则git add中没有一个现在生效。

仅限专家

如果在开始任何此操作之前,您已经有一些精心设置的状态 - 例如,来自git add -p - 您要保留,这需要执行两个提交,并且在恢复之前git stash,之后git stash apply --index更简单。这是因为git stash实际上进行了两次提交,而git stash apply --index分别提取并将这两次提交应用于索引和工作树。 (如果一切顺利,那么git stash drop藏匿。)

根据git stash的舒适程度,您甚至可以用git stash && git revert <hash> && git stash pop替换上面的整个序列,将其作为单行代码。添加--index以恢复单独的索引状态。 (请注意,如果您输入错误--index并且您的Git版本不够现代以检测错误,则会将两个单独的提交混合在一起并删除存储。这就是我喜欢使用git stash apply代替的原因git stash pop这里。)

如果在此过程中出现任何错误错误,您将需要确切知道发生了什么,以及如何应对,因此只有专家才能使用&#34;&#34;这一部分上方的标题。

答案 2 :(得分:0)

另一种方法是设置一个糟糕的$ EDITOR,如:

EDITOR=nope git revert <hash>

在尝试编辑提交消息时退出但已经暂时更改了

答案 3 :(得分:-1)

git revert <commit-hash>

git cherry-pick -n <commit-hash>