有没有办法“软还原”旧的提交?

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-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交换新的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 adds 现在都有效。如果您使用git reset --mixed,那么这些git adds 现在都不会生效。

仅供专家参考

如果在开始之前,您已经有一些精心准备的状态(例如,来自git add -p)并且想要保留,这需要进行 两次 提交和 @987654339还原之前的@,之后的git stash apply --index,更简单。这是因为git stash 实际上进行 两次提交,而git stash apply --index 将这两个提交分别提取并应用到索引和工作树。 (然后git stash drop stash,如果一切顺利的话。)

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

如果在此过程中出现任何错误,您需要确切知道发生了什么以及如何处理,因此这部分上方的“仅供专家使用”标题。

【讨论】:

谢谢!!这正是我所需要的。 git revert -n 正是我想要的【参考方案3】:

这个命令通常对我有用: git revert --no-commit &lt;commit&gt;

【讨论】:

【参考方案4】:
git revert <commit-hash>

git cherry-pick -n <commit-hash>

【讨论】:

【参考方案5】:

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

EDITOR=nope git revert <hash>

它会在尝试编辑提交消息但已经暂存更改时退出

【讨论】:

对我不起作用,它无论如何都会打开 vim(默认 git 编辑器)

以上是关于有没有办法“软还原”旧的提交?的主要内容,如果未能解决你的问题,请参考以下文章

plsql 中执行UPDATE误操作 怎样回滚。执行update后,并没有点提交,但是我把SQL窗口关掉了,有啥办法?

ORA-01152: 文件 1 没有从过旧的备份中还原

如何使用命令行搜索提交消息? [复制]

如何中止mercurial中的合并?

还原 - 在TortoiseHg Workbench中的所有内容

解决方法未能正确加载“VaCodeInspectionsPackage”包