如何撤消git reset --hard HEAD〜1?

是否能夠撤消如下命令引發的更改? 若是是這樣,怎麼辦? git

git reset --hard HEAD~1

#1樓

IRL案例示例:

$ 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.

#2樓

我知道這是一個老話題...可是隨着許多人在尋找方法來撤消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中的工具使用,很是方便。 索引


#3樓

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又被放回原位。


#4樓

若是Git還沒有進行垃圾回收,則能夠恢復它。

使用fsck獲取懸空提交的概述:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

使用rebase恢復懸空的提交:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

#5樓

編寫了一個小腳本,以使其更容易找到正在尋找的提交:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \\{\\} | egrep '^commit |Date:'

是的,能夠用awk或相似的東西使它漂亮得多,可是它很簡單,我只須要它。 可能會救別人30秒。

相關文章
相關標籤/搜索