1. 程式人生 > 其它 >Dart 資料型別 - List

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 把file丟掉

現在我的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》科幻電影還在繼續更新中,敬請期待哦~










原文連結

⬇️ 點選“下方連結”,提升測試核心競爭力!https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=bokeyuan&timestamp=1650615463

>>更多技術文章分享和免費資料領取