有没有办法“软还原”旧的提交?
Posted
技术标签:
【中文标题】有没有办法“软还原”旧的提交?【英文标题】:Is there a way to 'soft revert' an old commit? 【发布时间】:2016-10-15 19:37:50 【问题描述】:有没有办法在不更改工作目录中的文件的情况下恢复旧的提交? 不久前我提交了一个提交,但我提交的代码还没有准备好,我希望这些更改作为未提交的更改保留在我的工作目录中,以便我现在可以继续处理它们。 我查看了 revert 命令,但它改变了工作目录。 我正在考虑检查旧版本,重置 head 1 并存储更改,但我已经有了更改。我只是希望它就像我当时从未提交过那样,但我希望保留对文件的更改。
【问题讨论】:
IIRC,git reset
会这样做
git reset
可以带你回到旧的提交,但这就是我现在需要做的。
看来你想要的是恢复并进入你的工作树,从几个提交回来的提交更改,但不会恢复或丢失最近的提交,如合并或其他'工作等
【参考方案1】:
你可以这样做
git revert hash_of_your_commit
git reset HEAD^
之后,您对已恢复的提交进行了未暂存的更改。
【讨论】:
【参考方案2】:简短的回答是“不”。
更长的答案: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
交换新的revert commit和临时commit的顺序:
$ 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
s 现在都有效。如果您使用git reset --mixed
,那么这些git add
s 现在都不会生效。
仅供专家参考
如果在开始之前,您已经有一些精心准备的状态(例如,来自git add -p
)并且想要保留,这需要进行 两次 提交和 @987654339还原之前的@,之后的git stash apply --index
,更简单。这是因为git stash
实际上进行 两次提交,而git stash apply --index
将这两个提交分别提取并应用到索引和工作树。 (然后git stash drop
stash,如果一切顺利的话。)
根据您对git stash
的舒适程度,您甚至可以将上面的整个序列替换为git stash && git revert <hash> && git stash pop
,以将其作为单行。添加--index
以恢复单独的索引状态。 (请注意,如果您拼写错误 --index
并且您的 Git 版本不够现代,无法检测到错误,这会将两个单独的提交混合在一起并删除存储。这就是为什么我喜欢使用 git stash apply
而不是 git stash pop
在这里。)
如果在此过程中出现任何错误,您需要确切知道发生了什么以及如何处理,因此这部分上方的“仅供专家使用”标题。
【讨论】:
谢谢!!这正是我所需要的。git revert -n
正是我想要的【参考方案3】:
这个命令通常对我有用:
git revert --no-commit <commit>
【讨论】:
【参考方案4】:git revert <commit-hash>
git cherry-pick -n <commit-hash>
【讨论】:
【参考方案5】:另一种方法是设置一个错误的 $EDITOR,例如:
EDITOR=nope git revert <hash>
它会在尝试编辑提交消息但已经暂存更改时退出
【讨论】:
对我不起作用,它无论如何都会打开 vim(默认 git 编辑器)以上是关于有没有办法“软还原”旧的提交?的主要内容,如果未能解决你的问题,请参考以下文章
plsql 中执行UPDATE误操作 怎样回滚。执行update后,并没有点提交,但是我把SQL窗口关掉了,有啥办法?