有没有办法在不改变工作目录中的文件的情况下恢复旧的提交?我不久前做了一个提交,但是我提交的代码还没有准备好,我希望那些更改作为未提交的更改留在我的工作目录中,这样我现在就可以继续工作了。我研究了revert命令,但是它改变了工作目录。我想 checkout 旧的修订版本,重置head 1并隐藏更改,但我已经有了更改。我只是希望它就像我从来没有做过一个提交的方式回到那时,但我希望对文件的更改留下来。
ars1skjm1#
你可以这样做
git revert hash_of_your_commit git reset HEAD^
在此之后,您将得到恢复提交的未暂存更改。
wvmv3b1j2#
此命令通常适用于我:git revert --no-commit <commit>
git revert --no-commit <commit>
cgh8pdjw3#
简短的回答是“不”。那会子回答:git revert-像所有面向合并的操作一样,包括git cherry-pick,git rebase,当然还有git merge本身-使用索引修改一个可修改的工作树。你可以提交或隐藏你当前的工作,或者获得第二个工作树(用另一个克隆,或者如果你有Git 2.5或更高版本,使用git worktree)。您可以使用git revert -n,它允许工作树是脏的,但是我在这里并不建议这样做。我处理这个问题的方法是现在提交:
git revert
git cherry-pick
git rebase
git merge
git worktree
git revert -n
$ git add ... $ git commit -m 'temporary commit, do not push'
然后,作为常规提交执行所需的恢复:
$ git revert <hash>
然后使用git rebase -i交换新的还原提交和临时提交的顺序:
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 reset --soft HEAD^
HEAD~1
git reset --mixed HEAD^
git reset --soft
git add
git reset --mixed
如果在你开始之前,你已经有了一些你想要保留的状态--比如,来自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使用”的标题。
git add -p
git stash
git stash apply --index
git stash drop
git stash && git revert <hash> && git stash pop
--index
git stash apply
git stash pop
8iwquhpp4#
git revert <commit-hash> git cherry-pick -n <commit-hash>
62o28rlo5#
一个很好的选择是使用git apply,这是一个安全的操作,并且不会编辑本地git历史。
git apply
git show COMMIT_HASH | git apply -R
"工作原理"通过使用git show,我们从一个特定的提交中获得diff,然后git apply -R反转这些更改,并将它们应用到当前的repo(不提交)
git show
git apply -R
oxalkeyp6#
另一种方法是设置一个错误的$EDITOR,例如:
EDITOR=nope git revert <hash>
当试图编辑提交消息但已经暂存了更改时,它将退出
6条答案
按热度按时间ars1skjm1#
你可以这样做
在此之后,您将得到恢复提交的未暂存更改。
wvmv3b1j2#
此命令通常适用于我:
git revert --no-commit <commit>
cgh8pdjw3#
简短的回答是“不”。
那会子回答:
git revert
-像所有面向合并的操作一样,包括git cherry-pick
,git rebase
,当然还有git merge
本身-使用索引修改一个可修改的工作树。你可以提交或隐藏你当前的工作,或者获得第二个工作树(用另一个克隆,或者如果你有Git 2.5或更高版本,使用git worktree
)。您可以使用
git revert -n
,它允许工作树是脏的,但是我在这里并不建议这样做。我处理这个问题的方法是现在提交:
然后,作为常规提交执行所需的恢复:
然后使用
git rebase -i
交换新的还原提交和临时提交的顺序:然后使用
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使用”的标题。
8iwquhpp4#
62o28rlo5#
一个很好的选择是使用
git apply
,这是一个安全的操作,并且不会编辑本地git历史。"工作原理"
通过使用
git show
,我们从一个特定的提交中获得diff,然后git apply -R
反转这些更改,并将它们应用到当前的repo(不提交)oxalkeyp6#
另一种方法是设置一个错误的$EDITOR,例如:
当试图编辑提交消息但已经暂存了更改时,它将退出