Git的使用教程(三)查看日志和版本回退
我們使用任何的版本管理工具,原因無外乎就是想要記錄文件新增、修改、刪除等相關(guān)操作,當(dāng)我們修改文件出現(xiàn)錯誤的時候,可以及時回到?jīng)]有出錯的“備份”文件。當(dāng)然Git作為優(yōu)秀的版本管理工具這樣的功能當(dāng)然不能少,下面我們就來看下與版本管理相關(guān)的一些命令吧。
? ??命令:git log
? ? git log可以記錄我們git commit操作(不會記錄git add操作,如果你沒有進行過一次git commit,那么git log的時候什么都不會顯示),每次git commit都會產(chǎn)生一條記錄,每條記錄代表一次commit,一條記錄共有四部分組成。
? ??
? ??commit:是一個由SHA1計算出來的非常大的數(shù)字,用十六進制表示,是此次操作的唯一標(biāo)識符(每次commit的時候該值不會重復(fù)),我們可以通過它準(zhǔn)確的找到此次提交操作,為恢復(fù)到該版本打下堅實的基礎(chǔ)。
? ??Author: 提交該版本的作者以及該作者的郵箱
? ? 在多人協(xié)作中,每個人都有可能對文件做出一些調(diào)整,如何區(qū)分是什么人做了這些調(diào)整呢,這就用到了Author。我們可以使用git config user.name和git config user.email來獲取當(dāng)前用戶名和用戶郵箱,如果沒有設(shè)置或是需要調(diào)整,可以通過git config --global user.name "new name"來進行調(diào)整。設(shè)置Author很有必要,最好在git init之后就立刻設(shè)置,這樣在你進行g(shù)it commit的時候就能記錄你設(shè)置的Author信息了。
? ??
? ??Date:提交的日期。
? ??最后:最后一行就是關(guān)于此次提交的說明,也就是我們git commit -m的內(nèi)容了,這可以讓我們更加清楚為什么做此次提交操作,為以后的版本恢復(fù)打下堅實基礎(chǔ)。
? ? 直接使用git log,會展示每次提交的詳細的信息,但是當(dāng)commit信息過多,亦或者我們不想要這么詳細的信息的時候,此時我們就可以使用git log的另一種用法。
[plain]?view plain?copygit?log?--pretty=oneline??
變少了有某有,這樣一屏下來就可以展示更多的commit信息了。? ??命令:git reset? ? git log只是幫我們記錄了每次的提交操作,我們想要進行不同的版本切換,還需要用到git reset命令。在此之前,我們先多進行幾次提交操作。準(zhǔn)備工作做好了,正式開始吧。
? ??方法一:[plain]?view plain?copygit?reset?--hard?HEAD^??git reset是版本回退命令,--hard是回退命令的一個參數(shù),暫時不用深究它具體代表什么含義,只要記住這樣操作可以達到我們回退的目的即可。前面的部分我們暫且把它當(dāng)做是實現(xiàn)版本回退的一種固定格式,我們重點來說下HEAD^。在Git中,HEAD代表的是當(dāng)前版本,拿上述例子來說就是"add four line",而加個^,就表示當(dāng)前版本之前的版本,就是例子中“add third line”,每加一個^就表示更前的一個版本,例如HEAD^^就表示“add second line”這個版本,如果想要回到100個版本前,就需要100個^,當(dāng)然回退的版本太靠前的話,光寫^也是個麻煩事,還有,Git提供了另一種寫法解決了這個問題。
? ??方法二:
[plain]?view plain?copygit?reset?--hard?HEAD~1??把HEAD^換成了HEAD~1,其中1代表回退幾個版本,如果需要回退到10個之前的版本,只需要把HEAD~1改為HEAD~10即可,是不是比10個^方便了好多呢??雌饋硎欠奖懔它c,但是仍有不足,如果想要回退到某個版本的時候,豈不是還要查一下這個版本和當(dāng)前版本之間的差。Git也考慮到了這個問題,因此提供了第三種方法供我們使用。
? ??方法三:? ??[plain]?view plain?copygit?reset?--hard?1e7fac4??還記得剛才git log中提到的commit嗎,此時我們就是把HEAD換成了commit。正是由于commit字串的唯一性,我們才能快速準(zhǔn)確的回退到我們需要的版本,而不需要查找當(dāng)前版本和切換版本之間的差值。關(guān)于--hard后面的這個字串,相信不少朋友還有疑問,下面小編就一一解答。? ??疑問一:該字串從哪里來的?? ? 每次git commit的時候Git都會生成這樣一個字串方便做版本管理,可以通過git log來查看每個版本具體commit字串值。? ??疑問二:進行版本回退的時候如何填寫該字串?? ? 其實這個并沒有硬性的規(guī)定,經(jīng)過小編測試,這個字串至少是4位,也就是說我們至少需要取commit字串的前4位(4位以下會報錯)。其實輸入的這個字串是為了確保Git能夠準(zhǔn)確的找到對應(yīng)的版本,如果版本中有前4位重復(fù)的,那么我們就需要多增加一位,確保Git不會找錯了。那么多少位適合呢?如果使用Git時間久了,就會發(fā)現(xiàn),很多操作使用到這個commit的時候都會把它縮略為前7位,因此,我們也可以沿用,使用前7位作為默認(rèn)位數(shù),當(dāng)然,如果前7位仍不唯一,就需要輸入前8位了。
? ??命令:git reflog
? ? 一次又一次的回退操作已經(jīng)使得我們忘乎所以,不知不覺已經(jīng)快回退到最初的版本了,但這時候我們又懷念起了新版本的好,想要回去,可是git log中已經(jīng)沒有新版本的任何足跡了,我們還回的去嗎?答案是肯定的,凡走過必留下痕跡,Git也同樣為我們留下了蛛絲馬跡。
git reflog是Git提供給我們記錄命令歷史,commit和reset都在被記錄之列。通過git reflog,我們發(fā)現(xiàn)了最后一次提交的commit的字串,有了它我們是不是可以找回最新的版本呢?抱著懷疑的態(tài)度我們進行了嘗試,再看下git log,哇塞,居然回到了進行回退前的狀態(tài),這樣一來我們豈不是可以自由徜徉在各個版本之間了。





