是否可以撤消由以下命令引起的更改?如果是,怎么办?

git reset --hard HEAD~1

当前回答

在大多数情况下,是的。

根据运行命令时存储库的状态,git reset-hard的效果可能从微不足道到撤消,甚至根本不可能。

下面我列出了一系列不同的可能情况,以及如何从中恢复。

我的所有更改都已提交,但现在提交都已取消!

这种情况通常发生在使用参数运行git-reset时,如git-reset--hardHEAD~。别担心,这很容易恢复!

如果您刚刚运行了git reset,并且此后没有做任何其他操作,那么您可以回到使用这一行程序的位置:

git reset --hard @{1}

这将重置当前分支,无论它在上次修改之前处于什么状态(在您的情况下,对分支的最近修改将是您尝试撤消的硬重置)。

但是,如果在重置之后对分支进行了其他修改,则上面的一行代码将不起作用。相反,您应该运行gitreflog<branchname>来查看最近对分支所做的所有更改(包括重置)的列表。该列表将如下所示:

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

在此列表中查找要“撤消”的操作。在上面的示例中,它将是第一行,即“重置:移动到HEAD~”。然后在该操作之前(下面)复制提交的表示。在我们的例子中,这将是master@{1}(或3ae5027,它们都表示相同的提交),并运行git-reset--hard<commit>将当前分支重置为该提交。

我用gitadd进行了更改,但从未提交。现在,我的改变消失了!

这有点难以恢复。git确实有您添加的文件的副本,但由于这些副本从未绑定到任何特定的提交,因此无法一次恢复所有更改。相反,您必须在git的数据库中找到各个文件并手动恢复它们。您可以使用git fsck执行此操作。

有关此操作的详细信息,请参阅Undo git reset-hard with subcommitted files in the staging area。

我对工作目录中的文件进行了更改,这些更改从未使用gitadd进行过,也从未提交过。现在,我的改变消失了!

噢。我不想告诉你这些,但你可能运气不好。git不存储未添加或提交的更改,根据git reset文档:

--硬的,硬的重置索引和工作树。自<commit>以来,对工作树中跟踪文件的任何更改都将被丢弃。

您可能可以使用某种磁盘恢复实用程序或专业的数据恢复服务来恢复更改,但在这一点上,这可能会带来更多的麻烦。

其他回答

gitreset-hard-您可以使用它还原一个页面,然后可以再次隐藏或从原始页面中提取所有内容

答案隐藏在上面的详细响应中,您可以简单地执行以下操作:

$> git reset --hard HEAD@{1}

(参见git-relog show的输出)

您要做的是指定要还原到的提交的sha1

git reset --hard <sha1 of desired commit>

但不要等太久。。。几周后,git将最终看到提交未被引用,并删除所有blob。

注意:此答案仅在使用IntelliJ等IDE时有效

我最近遇到了一个类似的问题,我既没有进行改变,也没有做出承诺。可以选择当地历史。我能够从IntelliJ的本地历史还原更改(参考)。

希望这对某人有所帮助。

制作了一个很小的脚本,以便稍微容易地找到要查找的提交:

git fsck--lost found | grep commit | cut-d“”-f 3 | xargs-i git show \{\}| egrp“^commit |日期:”

是的,它可以用锥子或类似的东西做得更漂亮,但它很简单,我只是需要它。可能会为其他人节省30秒。