有没有办法在不更改工作目录中的文件的情况下还原旧提交? 我做了一段时间的提交,但我提交的代码还没准备好,我希望这些更改作为未提交的更改保留在我的工作目录中,以便我现在可以继续处理它们。 我查看了revert命令但更改了工作目录。 我正在考虑检查旧版本,重置头1并存储更改,但我已经有了更改。我只是希望它好像我从来没有做过那样的提交方式,但我希望保留对文件的更改。
答案 0 :(得分:6)
您可以执行类似
的操作git revert hash_of_your_commit
git reset HEAD^
之后,您将对已还原的提交进行非暂停更改。
答案 1 :(得分:2)
简短的回答是" no"。
答案较长:git revert
- 与所有面向合并的操作一样,包括git cherry-pick
,git 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>