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

Per*_*n93 3 git git-revert

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

Ber*_*rni 14

这个命令通常对我有用: git revert --no-commit <commit>


Yar*_*huk 7

你可以做点什么

git revert hash_of_your_commit
git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

之后,您将对还原的提交进行非分段更改.


tor*_*rek 3

最简洁的答案是不”。

\n\n

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

\n\n

您可以使用git revert -n,这会使工作树变脏,但我在这里并不建议这样做。

\n\n

我处理这个问题的方法是现在进行提交:

\n\n
$ git add ...\n$ git commit -m \'temporary commit, do not push\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,将所需的恢复作为常规提交:

\n\n
$ git revert <hash>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ git rebase -i HEAD~2  # and edit the two "pick" lines\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

(主要)与索引状态有关:如果您使用git reset --soft,所有这些git add现在都有效。如果您使用git reset --mixed,那么这些git add现在都不会生效。

\n\n

仅供专家使用

\n\n

如果在开始任何操作之前,您已经有一些精心准备的状态\xe2\x80\x94,例如,来自git add -p您想要保留的\xe2\x80\x94,则这需要执行两次提交,然后git stash在恢复之前,之后git stash apply --index,更简单。这是因为git stash实际上进行了两次提交,并git stash apply --index分别提取这两次提交并将其应用到索引和工作树。(然后git stash drop如果一切顺利的话,那就是藏品。)

\n\n

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

\n\n

如果在此过程中出现任何问题您将需要确切地知道发生了什么以及如何处理,因此这部分上方有“仅限专家”标题。

\n