git reflog 命令是用來恢復(fù)本地錯誤操作很重要的一個命令,所以在這里對它進行一下整理。
1、git reflog命令說明
reflog翻譯:Reference logs(參考日志)
git reflog命令:可以叫做顯示可引用的歷史版本記錄。
可引用歷史提交版本,什么意思?
-
使用
git log命令只可以查看到HEAD指針及其之前的版本信息,如果版本發(fā)生過回退操作,則可能會出現(xiàn),HEAD指針之后仍存在歷史提交版本的情況,而這些提交版本信息通過git log命令是看不到的。即:
git log命令是顯示當前的HEAD和它的祖先,遞歸是沿著當前指針的父親,父親的父親,……,這樣的原則。 我們可以通過使用
git reflog命令,就可查看到所有歷史版本信息。由于查看所有歷史版本信息的目的,大多是為了進行版本回退或恢復(fù)操作所使用,從中找到所需的commit索引,所以該命令被命名為reflog,即:引用日志。
git log命令與git reflog命令作用范圍示意圖:

提示:
reflog并不是Git倉庫的一部分,它單獨存儲,它純屬是本地的。 (git reflog命令顯示的內(nèi)容,應(yīng)該是存儲在.git/logs/HEAD文件中,或者是.git/logs/refs目錄中的文件。)也就是說
git reflog命令中保留了從clone倉庫開始,用戶所有在本地庫中的操作。
2、git reflog命令顯示內(nèi)容
# 1.查看版本庫中歷史提交記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git log --oneline
68d777d (HEAD -> master) 我是第3次提交,重新修改的message
8b3a071 第2次提交,新增內(nèi)容:git commit --amend v2
d3e2d8c 第1次提交,新增readme.txt文件
# 2.查看可引用的歷史提交記錄
69a9841 HEAD@{0}: commit (amend): 我是第3次提交,重新修改的message
bd4fd48 HEAD@{1}: commit: 第3次提交,新增內(nèi)容:git commit --amend v3
8b3a071 HEAD@{2}: commit: 第2次提交,新增內(nèi)容:git commit --amend v2
d3e2d8c HEAD@{3}: commit (initial): 第1次提交,新增readme.txt文件
從上可以看到,執(zhí)行git reflog 命令,比執(zhí)行git log命令多顯示了一條內(nèi)容。
(是使用git commit --amend命令追加提交時,覆蓋了一條提交記錄)
說明:
最前面是歷史提交commit-id的前7位,根據(jù)這7位可以將版本庫恢復(fù)到對應(yīng)節(jié)點狀態(tài)。
HEAD@{n}:表示HEAD更改歷史記錄,最新的更改在上面。HEAD@{2}:表示HEAD指針在兩次移動之前的情況。master@{one.week.ago}:表示master分支在本地倉庫一周之前的情況。-
通過
HEAD@{n}語法可以回退到指定的提交。例如:
git reset --hard HEAD@{3}。 與
HEAD@{n}與HEAD~n功能類似,但是HEAD~n回退的是git log命令顯示的歷史提交記錄,而HEAD@{n}回退的是git reflog命令顯示的歷史提交記錄。最后一個冒號后面的字串為,該提交的說明信息摘要。
3、具體的用法
git reflog命令具體用法如下:
-
git reflog [show] [log-options] [<ref>]:就是顯示同可引用的歷史版本,同git reflog。就在后邊可以加日志的選項。 -
git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all | <refs>…]:刪除掉更老的reflog條目。 -
git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] ref@{specifier}…:從reflog中刪除一個條目。 -
git reflog exists <ref>:檢查一個ref是否有一個reflog條目。
4、引起ref變化的操作有
所有引起HEAD指針變動的操作,都會被記錄在git reflog命令中。
我們可知,引起HEAD指針變化的操作有:
-
git checkout branchName:切換分支 。 -
git commit:提交。 -
git reset commit:重置。 -
git checkout commit:簽出某一個提交。 -
git merge:合并操作。 -
git rebase:基變。 -
git pull:相當于 fetch + merge 。 -
git pull : Fast-forward:沒有沖突,快速前進。 -
git pull --rebase:相當于fetch + rebase。 -
git clone:初始化ref 。
參考: