git 是否有方法“软恢复”旧提交?

vc6uscn9  于 2022-11-20  发布在  Git
关注(0)|答案(6)|浏览(135)

有没有办法在不改变工作目录中的文件的情况下恢复旧的提交?我不久前做了一个提交,但是我提交的代码还没有准备好,我希望那些更改作为未提交的更改留在我的工作目录中,这样我现在就可以继续工作了。我研究了revert命令,但是它改变了工作目录。我想 checkout 旧的修订版本,重置head 1并隐藏更改,但我已经有了更改。我只是希望它就像我从来没有做过一个提交的方式回到那时,但我希望对文件的更改留下来。

ars1skjm

ars1skjm1#

你可以这样做

git revert hash_of_your_commit
git reset HEAD^

在此之后,您将得到恢复提交的未暂存更改。

wvmv3b1j

wvmv3b1j2#

此命令通常适用于我:git revert --no-commit <commit>

cgh8pdjw

cgh8pdjw3#

简短的回答是“不”。
那会子回答: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现在都无效。

仅供Maven使用

如果在你开始之前,你已经有了一些你想要保留的状态--比如,来自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。)
如果在此过程中出现任何 * 错误 *,您将需要确切地知道发生了什么,以及如何处理它,因此在此部分上方有“仅供Maven使用”的标题。

8iwquhpp

8iwquhpp4#

git revert <commit-hash>

git cherry-pick -n <commit-hash>
62o28rlo

62o28rlo5#

一个很好的选择是使用git apply,这是一个安全的操作,并且不会编辑本地git历史。

  • 这将软还原特定提交 *
git show COMMIT_HASH | git apply -R

"工作原理"
通过使用git show,我们从一个特定的提交中获得diff,然后git apply -R反转这些更改,并将它们应用到当前的repo(不提交)

oxalkeyp

oxalkeyp6#

另一种方法是设置一个错误的$EDITOR,例如:

EDITOR=nope git revert <hash>

当试图编辑提交消息但已经暂存了更改时,它将退出

相关问题