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