是否能够撤消如下命令引发的更改? 若是是这样,怎么办? git
git reset --hard HEAD~1
$ git fsck --lost-found
Checking object directories: 100% (256/256), done. Checking objects: 100% (3/3), done. dangling blob 025cab9725ccc00fbd7202da543f556c146cb119 dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4 dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98 dangling blob 9183b84bbd292dcc238ca546dab896e073432933 dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22 dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7 dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66 dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b dangling blob b87163c8def315d40721e592f15c2192a33816bb dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7 dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133 dangling blob 4a71f9ff8262701171d42559a283c751fea6a201 dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2 dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed dangling blob 749ffc9a412e7584245af5106e78167b9480a27b dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a <- it's this one
$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a
commit f6ce1a403399772d4146d306d5763f3f5715cb5a Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local> Date: Wed Aug 15 08:41:30 2012 +0200 *MY COMMIT MESSAGE IS DISPLAYED HERE* diff --git a/Some.file b/Some.file new file mode 100644 index 0000000..15baeba --- /dev/null +++ b/Some.file *THE WHOLE COMMIT IS DISPLAYED HERE*
$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a
First, rewinding head to replay your work on top of it... Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.
我知道这是一个老话题...可是随着许多人在寻找方法来撤消Git中的内容,我仍然认为继续在此处提供提示多是一个好主意。 工具
当您执行“ git add”或将任何内容从git gui的左上角移动到左下角时,文件内容存储在Blob中,而且文件内容能够从该Blob中恢复。 ui
所以,即便文件还没有提交但必须已添加,也能够恢复该文件。 this
git init echo hello >> test.txt git add test.txt
如今已经建立了blob,可是它已由索引引用,所以在咱们重置以前,它不会与git fsck一块儿列出。 因此咱们重置... spa
git reset --hard git fsck
您将获得一个悬挂的斑点ce013625030ba8dba906f756967f9e9ca394464a 3d
git show ce01362
会给你文件内容“你好” code
为了找到未引用的提交,我在某个地方找到了提示。 orm
gitk --all $(git log -g --pretty=format:%h)
我将它做为git gui中的工具使用,很是方便。 索引
Pat Notz是正确的。 只要几天以内就能够收回承诺。 git仅在大约一个月后收集垃圾,除非您明确告诉它删除较新的blob。 it
$ 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重置时,file2又被放回原位。
若是Git还没有进行垃圾回收,则能够恢复它。
使用fsck
获取悬空提交的概述:
$ git fsck --lost-found dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
使用rebase恢复悬空的提交:
$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
编写了一个小脚本,以使其更容易找到正在寻找的提交:
git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \\{\\} | egrep '^commit |Date:'
是的,能够用awk或相似的东西使它漂亮得多,可是它很简单,我只须要它。 可能会救别人30秒。