是否能夠撤消如下命令引發的更改? 若是是這樣,怎麼辦? 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秒。