Dart 資料型別 - List
Git 是一個開源的分散式版本控制系統,可以有效、高速地處理從很小到非常大的專案版本管理。Git 強大的分支管理,遠遠超過 SVN。那 git 如何建立版本庫?如何進行一些常用的操作呢?欲知答案如何,請看下文分解。
小時候看過一部印象很深的劇叫做《穿越時空的愛戀》,今日也厚著臉皮導演一部《穿越時空的git》,不上映,純屬自嗨!
what is 版本庫?無論我們平常使用git的頻率如何,但是從事IT這個行業的小夥伴一定經常聽到有人在說,哪個哪個牛X的專案在哪個倉庫,哪個專案的倉庫被人惡意新增issue(之前就聽說了阿波羅計劃的程式碼倉庫中issue被很多無關的中文評論佔樓~哎,咱們測試工程師一定不要這樣做,為這個行業盡一份力);
說了這麼多廢話,其實我們平常說的倉庫就是版本庫,版本庫又名倉庫,英文名叫repository,相信很多用GitHub的小夥伴經常看到這個單詞;
我就簡單的把它理解成一個目錄資料夾,裡面可以放各種檔案,和平常的使用管理一樣,可以刪除、修改;但是Git的”資料夾“更強大一點,它記性好-Git可以"記住"整個管理的歷史,還能”存檔“。
如何建立一個版本庫,很簡單:
- 1)選擇一個路徑(you like just ok!),建立一個空目錄
$ mkdir mygit
$ cd mygit
$ pwd
/Users/qinzhen/mygit #這裡就是我的Mac上建立的倉庫地址了
- 2)倉庫地址建立好了,現在就是一個普通的資料夾,後使用git init命令將它變成”Git資料夾“,也就是把這個目錄變成Git可以管理的倉庫
$ git init
Initialized empty Git repository in /Users/qinzhen/mygit/.git/
它會提示說在你的目錄下建立了一個空的Git倉庫,並且目錄下多了一個.git,這個時候就算建立完成了。
在看命令之前先來用一張圖瞭解幾個概念,可以方便理解和記憶:
- 工作區(Working Directory)
- 臨時倉庫(暫存區,Staging Area)
- Git倉庫(Repository)
我們就是先在工作區進行檔案的編輯操作;然後add到臨時倉庫,可以add多個;最後再commit一起提交到倉庫中。
接下來正式進入實操:
1)在mygit路徑下,建立檔案readme.txt,輸入以下內容:
I want to study Git
2)利用git add命令將檔案提交到臨時倉庫(執行成功不會輸出任何訊息,看不到輸出不要慌~)
$ git add readme.txt
3)再用git commit命令將檔案從暫存區提交到倉庫去
localhost:mygit qinzhen$ git commit -m "study git"
[master 64f5ced] study git
1 file changed, 2 insertions(+), 2 deletions(-)
命令解釋:
-m : 添加註釋,對本次提交寫一個說明
1 file changed :
1個檔案被改變,也就是readme.txt;
2 insertions(+):
2行插入了內容,也就是我們輸入的兩行內容
2 deletions(-):
2行內容缺失了,因為我是把readme.txt檔案裡原有的內容刪除後新增的內容,
所以會有次改動提示,若是完全新建的就只會有新增的記錄
- 1)我們先用git status檢視當前倉庫的狀態
localhost:mygit qinzhen$ git status
On branch master
nothing to commit, working tree clean
現在表示在一個master分支上沒有可提交的東西,工作目錄當前是乾淨的
- 2)修改readme.txt檔案:
I want to study Git very much.
- 3)再使用git status檢視
localhost:mygit qinzhen$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
這時候可以看到檔案已經被修改了,但是並沒有被add和commit;
- 4)再使用git diff(different)命令來檢視當前操作和之前的操作有何區別之處,修改了哪裡:
localhost:mygit qinzhen$ git diff
diff --git a/readme.txt b/readme.txt
index 225e15a..8080bd8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
I am a test engineer.
-I want to study Git.
+I want to study Git very much.
可以看到我在第二行增加了very much
- 1)我們先將剛才修改好的檔案提交到倉庫中:
$ git add readme.txt
$ git commit -m "very much"
[master 7582a45] very much
1 file changed, 1 insertion(+), 1 deletion(-)
- 2)我們再使用git log命令來看看之前都幹了些什麼:
$ git log
commit 7582a45a1acd9f5540f381d6e9bb7c9d38e74348 (HEAD -> master)
Author: qinzhen <[email protected]>
Date: Thu Sep 19 16:48:31 2019 +0800
very much
commit 64f5cedd48745267e4e161c57f126a9230344339
Author: qinzhen <[email protected]>
Date: Thu Sep 19 16:05:40 2019 +0800
study git
在git log命令後,我們可以看到之前的提交commit歷史,每一次提交都分配了唯一的commit id,這個id就是我們回到過去的關鍵,就相當與科幻電影中回到過去的某個時期
3.1)HEAD——現在,我如果想回到study git的”時期“,可以使用git reset --hard HEAD^
$ git reset --hard HEAD^
HEAD is now at 64f5ced study git
$ cat readme.txt
I am a test engineer.
I want to study Git.
這個時候我們可以看到,已經成功的回到了study git的”時期“,very much已經消失不見
命令解釋:
如果回到過去不好理解的話,也可以理解為存檔,本人小時候喜歡玩一款電腦遊戲叫做紅色警戒,
打任務戰的時候每過一關前就會存檔一次,這樣就方便”死“了之後可以回到指定關卡重新再來
^代表上一個存檔,^^代表上上個存檔,如果想反會至上100個版本的話可以直接使用HEAD~100果回到過去
3.2)commit id——現在再修改檔案,在第一行新增I can fly,然後add、commit:
I am a test engineer,I can fly.
I want to study Git.
$ git add readme.txt
$ git commit -m "I can fly"
[master 9c32701] I can fly
1 file changed, 1 insertion(+), 1 deletion(-)
git log 檢視修改提交日誌
$ git log
commit 9c327016eec10a6db7f9b75ecb705df417b6508c (HEAD -> master)
Author: qinzhen <[email protected]>
Date: Thu Sep 19 17:06:10 2019 +0800
I can fly
commit 64f5cedd48745267e4e161c57f126a9230344339
Author: qinzhen <[email protected]>
Date: Thu Sep 19 16:05:40 2019 +0800
study git
上面說了可以利用commit id回到過去,現在咱們就來試試;使用git reset --hard 64f5ce...命令:
$ git reset --hard 64f5ced
HEAD is now at 64f5ced study git
$ cat readme.txt
I am a test engineer.
I want to study Git.
從上面的結果可以看到,我們已經通過commit id成功回到了過去,回到了那個沒有”I can fly“的年代;可以注意到的一點是,在寫commit id的時候並沒有寫全,只是寫了前面的一部分,git就可以找到了;
額。。。肯定有人要問具體是幾位,說實話~我也不知道0.0,也沒有專門去研究過,前四五位?六七位?七八位?達到使用要求就好啦,能保證id唯一,稍微多複製幾個就可以了。。。
3.3)回到add前的年代——僅add檔案到了暫存區,並沒有commit;感覺好像是進入到了add的另一重空間,在未來也找不到他,那想回到原來的”時期“的話,就可以使用git reset HEAD
現在我的readme.txt檔案內容如下,並且已經add到了暫存區:
I am a test engineer.I can fly!
I want to study Git.
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
使用git reset HEAD readme.txt命令將修改從add撤銷回來
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
3.4)這個時候又有個疑問,我只是把readme.txt從add後的暫存區給撤銷回來了,檔案並沒有改變的;想要把檔案的修改也撤回,就要使用git checkout --
$ git checkout -- readme.txt
$ cat readme.txt
I am a test engineer.
I want to study Git.
$ git status
On branch master
nothing to commit, working tree clean
補充:一個檔案已經被提交到了版本庫,有時候我們在工作區誤刪了某個檔案(rm或手動),這個時候版本庫中還是有這個檔案的,就可以通過git checkout --
如果真的想要從版本庫中將檔案刪除,就要用到git rm和git commit命令了
1)沒錯,一般穿越的電影裡到最後總是會找到方法返回未來的,git也不例外,除了可以回到過去(版本回退),也可以返回未來(回到新版本);
這裡我們還是要藉助於commit id來做,但是回退後再用git log已經看不到未來時期的定位座標了(commit id):
$ git log
commit 64f5cedd48745267e4e161c57f126a9230344339 (HEAD -> master)
Author: qinzhen <[email protected]>
Date: Thu Sep 19 16:05:40 2019 +0800
study git
2)這個時候就要用到git reflog命令了,記錄你之前走過的路:
$ git reflog
64f5ced (HEAD -> master) HEAD@{0}: reset: moving to 64f5ced
9c32701 HEAD@{1}: commit: I can fly
64f5ced (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
7582a45 HEAD@{3}: commit: very much
64f5ced (HEAD -> master) HEAD@{4}: commit: study git
在這裡就可以看到之前I can fly 的commit id;這裡順便提一句,上面說了commit id不用寫全部,寫前面一部分,但是不確定具體寫幾位,這裡看到git的log也只記錄了前7位,那就姑且算7位吧。。。
有了commit id就等於獲得了返回未來的座標資訊和方法,電影也差不多到了大結局的時候了,本文也就要結束了,來個收尾:
$ git reset --hard 9c32701
HEAD is now at 9c32701 I can fly
$ cat readme.txt
I am a test engineer,I can fly.
I want to study Git.
$ git status
On branch master
nothing to commit, working tree clean
關於《穿越時空的 Git》科幻電影還在繼續更新中,敬請期待哦~
原文連結