天天看點

《穿越時空的git》之建立版本庫和常用指令操作

Git 是一個開源的分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理。Git 強大的分支管理,遠遠超過 SVN。那 git 如何建立版本庫?如何進行一些常用的操作呢?欲知答案如何,請看下文分解。

《穿越時空的git》之建立版本庫和常用指令操作

小時候看過一部印象很深的劇叫做《穿越時空的愛戀》,今日也厚着臉皮導演一部《穿越時空的git》,不上映,純屬自嗨!

what is 版本庫?無論我們平常使用git的頻率如何,但是從事IT這個行業的小夥伴一定經常聽到有人在說,哪個哪個牛X的項目在哪個倉庫,哪個項目的倉庫被人惡意添加issue(之前就聽說了阿波羅計劃的代碼倉庫中issue被很多無關的中文評論占樓~哎,咱們測試工程師一定不要這樣做,為這個行業盡一份力);

說了這麼多廢話,其實我們平常說的倉庫就是版本庫,版本庫又名倉庫,英文名叫repository,相信很多用GitHub的小夥伴經常看到這個單詞;

我就簡單的把它了解成一個目錄檔案夾,裡面可以放各種檔案,和平常的使用管理一樣,可以删除、修改;但是Git的”檔案夾“更強大一點,它記性好-Git可以"記住"整個管理的曆史,還能”存檔“。

注:所有的版本控制系統,其實隻能跟蹤文本檔案的改動,比如TXT檔案,網頁,所有的程式代碼等等,Git也不例外。

如何建立一個版本庫,很簡單:

1)選擇一個路徑(you like just ok!),建立一個空目錄

《穿越時空的git》之建立版本庫和常用指令操作

2)倉庫位址建立好了,現在就是一個普通的檔案夾,後使用git init指令将它變成”Git檔案夾“,也就是把這個目錄變成Git可以管理的倉庫

《穿越時空的git》之建立版本庫和常用指令操作

它會提示說在你的目錄下建立了一個空的Git倉庫,并且目錄下多了一個.git,這個時候就算建立完成了。

《穿越時空的git》之建立版本庫和常用指令操作

2.1 送出檔案

在看指令之前先來用一張圖了解幾個概念,可以友善了解和記憶:

工作區(Working Directory)

臨時倉庫(暫存區,Staging Area)

Git倉庫(Repository)

《穿越時空的git》之建立版本庫和常用指令操作

我們就是先在工作區進行檔案的編輯操作;然後add到臨時倉庫,可以add多個;最後再commit一起送出到倉庫中。

接下來正式進入實操:

1)在mygit路徑下,建立檔案readme.txt,輸入以下内容:

I want to study Git

《穿越時空的git》之建立版本庫和常用指令操作

2)利用git add指令将檔案送出到臨時倉庫(運作成功不會輸出任何消息,看不到輸出不要慌~)

《穿越時空的git》之建立版本庫和常用指令操作

3)再用git commit指令将檔案從暫存區送出到倉庫去

《穿越時空的git》之建立版本庫和常用指令操作

指令解釋:

《穿越時空的git》之建立版本庫和常用指令操作

2.2 找不同(diff)

1)我們先用git status檢視目前倉庫的狀态

《穿越時空的git》之建立版本庫和常用指令操作

現在表示在一個master分支上沒有可送出的東西,工作目錄目前是幹淨的

2)修改readme.txt檔案:

《穿越時空的git》之建立版本庫和常用指令操作

3)再使用git status檢視

《穿越時空的git》之建立版本庫和常用指令操作

這時候可以看到檔案已經被修改了,但是并沒有被add和commit;

4)再使用git diff(different)指令來檢視目前操作和之前的操作有何差別之處,修改了哪裡:

《穿越時空的git》之建立版本庫和常用指令操作

可以看到我在第二行增加了very much

2.3 回到過去(撤銷回退)

1)我們先将剛才修改好的檔案送出到倉庫中:

《穿越時空的git》之建立版本庫和常用指令操作

2)我們再使用git log指令來看看之前都幹了些什麼:

《穿越時空的git》之建立版本庫和常用指令操作

在git log指令後,我們可以看到之前的送出commit曆史,每一次送出都配置設定了唯一的commit id,這個id就是我們回到過去的關鍵,就相當與科幻電影中回到過去的某個時期

3.1)HEAD——現在,我如果想回到study git的”時期“,可以使用git reset --hard HEAD^

《穿越時空的git》之建立版本庫和常用指令操作

這個時候我們可以看到,已經成功的回到了study git的”時期“,very much已經消失不見

如果回到過去不好了解的話,也可以了解為存檔,本人小時候喜歡玩一款電腦遊戲叫做紅色警戒,

打任務戰的時候每過一關前就會存檔一次,這樣就友善”死“了之後可以回到指定關卡重新再來

^代表上一個存檔,^^代表上上個存檔,如果想反會至上100個版本的話可以直接使用HEAD~100果回到過去

3.2)commit id——現在再修改檔案,在第一行添加I can fly,然後add、commit:

《穿越時空的git》之建立版本庫和常用指令操作

git log 檢視修改送出日志

《穿越時空的git》之建立版本庫和常用指令操作

上面說了可以利用commit id回到過去,現在咱們就來試試;使用git reset --hard 64f5ce...指令:

《穿越時空的git》之建立版本庫和常用指令操作

從上面的結果可以看到,我們已經通過commit id成功回到了過去,回到了那個沒有”I can fly“的年代;可以注意到的一點是,在寫commit id的時候并沒有寫全,隻是寫了前面的一部分,git就可以找到了;

額。。。肯定有人要問具體是幾位,說實話~我也不知道0.0,也沒有專門去研究過,前四五位?六七位?七八位?達到使用要求就好啦,能保證id唯一,稍微多複制幾個就可以了。。。

3.3)回到add前的年代——僅add檔案到了暫存區,并沒有commit;感覺好像是進入到了add的另一重空間,在未來也找不到他,那想回到原來的”時期“的話,就可以使用git reset HEAD 把file丢掉

現在我的readme.txt檔案内容如下,并且已經add到了暫存區:

《穿越時空的git》之建立版本庫和常用指令操作

使用git reset HEAD readme.txt指令将修改從add撤銷回來

《穿越時空的git》之建立版本庫和常用指令操作

3.4)這個時候又有個疑問,我隻是把readme.txt從add後的暫存區給撤銷回來了,檔案并沒有改變的;想要把檔案的修改也撤回,就要使用git checkout -- 指令了:

《穿越時空的git》之建立版本庫和常用指令操作

補充:一個檔案已經被送出到了版本庫,有時候我們在工作區誤删了某個檔案(rm或手動),這個時候版本庫中還是有這個檔案的,就可以通過git checkout -- 指令來”找回“;

如果真的想要從版本庫中将檔案删除,就要用到git rm和git commit指令了

2.4 傳回未來

1)沒錯,一般穿越的電影裡到最後總是會找到方法傳回未來的,git也不例外,除了可以回到過去(版本回退),也可以傳回未來(回到新版本);

這裡我們還是要借助于commit id來做,但是回退後再用git log已經看不到未來時期的定位坐标了(commit id):

《穿越時空的git》之建立版本庫和常用指令操作

2)這個時候就要用到git reflog指令了,記錄你之前走過的路:

《穿越時空的git》之建立版本庫和常用指令操作

在這裡就可以看到之前I can fly 的commit id;這裡順便提一句,上面說了commit id不用寫全部,寫前面一部分,但是不确定具體寫幾位,這裡看到git的log也隻記錄了前7位,那就姑且算7位吧。。。

有了commit id就等于獲得了傳回未來的坐标資訊和方法,電影也差不多到了大結局的時候了,本文也就要結束了,來個收尾:

《穿越時空的git》之建立版本庫和常用指令操作

關于《穿越時空的 Git》科幻電影還在繼續更新中,敬請期待哦~