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

git reset --hard HEAD~1

当前回答

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

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

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

其他回答

这救了我的命:https://medium.com/@CarrieGuss/如何从数字-数字-设置-b830b5e3f60c中恢复

基本上,您需要运行:

for blob in $(git fsck --lost-found | awk ‘$2 == “blob” { print $3 }’); do git cat-file -p $blob > $blob.txt; done

然后手动完成痛苦,将文件重新组织到正确的结构。

注意:千万不要使用git重置,如果你不能100%理解它的工作原理,最好不要使用它。

我刚在错误的项目上做了一个硬重置。拯救我生命的是Eclipse的本地历史。据说IntelliJ Idea也有一个,你的编辑也是如此,值得检查:

关于本地历史的Eclipse帮助主题http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F

我知道这是一条古老的线索。。。但随着许多人在寻找如何在Git中撤销这些东西,我仍然认为在这里继续提供提示可能是一个好主意。

当您在gitgui中执行“gitadd”或将任何内容从左上角移动到左下角时,文件的内容存储在一个blob中,文件内容可以从该blob中恢复。

因此,即使文件未提交但必须已添加,也可以恢复该文件。

git init  
echo hello >> test.txt  
git add test.txt  

现在创建了blob,但它被索引引用,因此在重置之前,它不会与git fsck一起列出。所以我们重置。。。

git reset --hard  
git fsck  

您将得到一个悬空blob ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

将向您返回文件内容“hello”

为了查找未引用的提交,我在某处找到了一个提示。

gitk --all $(git log -g --pretty=format:%h)  

我把它作为gitgui中的工具,它非常方便。

帕特·诺茨是正确的。你可以在几天内收回承诺。git只会在大约一个月后收集垃圾,除非您明确告诉它删除更新的blob。

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

您可以在示例中看到,由于硬重置,file2被删除,但当我通过reflog重置时,它被放回原位。

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