2017年9月19日星期二

GitHub 及 EGit ( PART 4 / 8 ) + Git Object Model

接上回【GitHub 及 EGit ( PART 3 / 8 ) + Git Staging

上一回說過別亂按【Commit and Push】,但【Commit】這個按鍵有沒有試按過呢?沒按過也沒關係,這裡會解說,但在解說之前,先了解一下【Git Object】是什麼。

Git Object


Git Object 共四類,每一類有各自功能,把這些 Object 串起來運用,就是 Git 的核心。

  1. Blob Object

  2. 是什麼都可以,在電腦眼中只是零及一。

    Binary Large OBject ( BLOB ) 這個術語在 Database 領域中一定會見到,而在 Git 中,它代表一個檔案,它是什麼都可以,可以是音樂檔 ( mp3, wav, aac, etc )、影片檔 ( mp4, avi, wmv, etc )、圖片檔 ( jpg, png, bmp, etc ),但最常見的,當然是文字檔 (java, c, xhtml, etc)。

    不同檔案名稱或存在路經不一樣,但內容一樣的話,都是會是同一個 Blob Object,計算 SHA-1 時,只計檔案內容,而不包括檔名及路徑。如果改了名或移動了檔案的話,要怎發現呢? Tree Object 有記錄。

  3. Tree Object

  4. 記錄一層的樹狀結構

    由左至右,Git mode…Object type…SHA-1…file / folder name。 Tree Object 記錄了單一層的目錄結構 ( Directory tree ),所以一個 Tree Object 裡,除了有 Blob 外,還有多個 Tree。

  5. Commit Object


  6. Commit Object 的內容有以下幾項︰

    Tree 被標籤 Tree Object 的 SHA-1 名稱。
    parent(s) 記錄上層 Commit。每一個 Commit Object 都會記錄上層 Commit,如果這次 Commit 是由多個 Commit 合併而來,會記錄多過一個上層 Commit。把所有 Commit Object 串起來,以圖像顯示,就是常看到的 Git history tree。
    author 作者名字 ( 可加上聯絡 E-mail ) 及日期時間。
    committer 實際 commit 的人,author 與 committer 可以是不同的人,同樣記錄了日期時間。
    comment committer 寫的註解 ( message ),通常第一行是主旨加前綴 ( eg. added、updated、Fix、Merge branch ),第二行空行,第三行描述內容。以前好像有說過,用心寫 commit message 的重要性,請參考以下網址。

    How to Write a Git Commit Message
    https://chris.beams.io/posts/git-commit/

    註︰Commit Object 亦叫 Commit ID,是由 20 個字組成的 SHA-1 名稱。

  7. Tag Object

  8. 記 SHA-1 對人類有點困難吧,把 Commit ID 標籤成常用的英文詞彙比較好記,而且可以方便在重要節點上畫上記號,例如 Ver 1.0、Release 1.0 之類的 milestone。


    Tag Object 的內容包括︰

    Tag name 好認好記的名字如 v1.0.0、v1.0.0b、v1.0.0rc之類。
    Object name 對應 Commit Object 的 SHA-1名稱。
    Type Object Type,除了 Commit Object 外,還可以用 Command Line 標籤 Blob 及 Tree Object。

    Tag 之中還有分 Lightweight Tag 及 Annotated Tag。兩者分別是,一個只是純粹標籤用,另一個符上額外一堆資訊並可以做 Digital Signage。

    ( For Annotated Tag ) Tagger 造 Tag 兇手的犯案日期及時間並符上名字,或許還留下聯絡用 E-mail。Tag 的 Message 不好好寫,Commit message 又是空白,完全沒有留下線索,不知道這個 tag 造出來是為什麼,這是挑釁嗎?不是明擺著要上門尋仇。
    ( For Annotated Tag ) Message 不想拉仇恨值,就好好寫 Message,面對各開發者,能省下很多解釋這解釋那的時間。

———————————簡易的分隔線————————————

嘗試 Commit,制作測試用資料︰


建立資料夾

首先建立一個新資料夾看看。
【File】 ==> 【New】 ==>【Folder】。

上一層資料夾及這個資料夾名稱

在 OOAD 這個資料夾中建立一個新資料夾叫【test_folder】。

建立一個 Text 檔案

在【test_folder】裡,新增一個 txt 檔案。

隨便打點字

打點字,例如【test_file】,然後【CTRL + S】儲存。

跟建立資料夾差不多

在【OOAD/test_folder】裡,儲存一個叫【txt_test】檔案。

不【Add to Index】,就不能做【Commit】。

不詳細示範怎去【Add to index】,不清楚怎做的話,回到頂頁,按連結,温習 Git Staging。
Comment 最好還是跟規範,現在就練習一下 Comment 應該怎樣寫。

黑底白勾圖示,表示現在用的 Branch,下一章會說明

由左至右,Branch name, Commit ID, Comment,每次 Commit 都注意一下有什變化。

盡量不要用 Amend,再 Commit 一次是個好辦法

修改檔案,做第二次 Commit
手殘,commit 打錯字,算了。到後期才發現,用 Amend 再提交一次新 commit……
注意!Amend 只適用在個人的 Local Repo,跟別人分享的 Repo 會有問題發生。

Amending Commits
http://wiki.eclipse.org/EGit/User_Guide#Amending_Commits

這是污點,不過記錄就是這一回事

結果變成了這樣……

———————————開啟 Git Perspective (Start)————————————

開啟【Git Perspective】

在【Git Perspective】有【Git Reflog】View,詳細的 Perspective 及 View 教學之前有寫過。

選擇 Repo 或 Branch 顯示【History】

【History】裡沒有顯示資訊,跟著下列步驟做︰
  1. 打開【Link with Editor and Selection】
  2. 選擇 Repo 或 Branch
———————————開啟 Git Perspective (End)————————————

下載及設定︰


除 Tag Object 外,Blob Object、Tree Object、Commit Object 都在之前的 Commit 中建立起來,現在用一些工具去印證理論,看看每種 Object 的內容及關係,加深了解它們在做什麼。沒找到有好用的 GUI 工具作展示,所以用 Command Line。

學 Command Line 的 Git 比較好

下載 PortableGit︰
https://github.com/git-for-windows/git/releases

對應作業系統 (32-bit 或 64-bit),看需要下載最新版本或舊一點的版本,以下教學是用【PortableGit-2.14.1-64-bit】作示範。

———————————額外資訊,可跳過的部份 (Start)————————————
我可能下載到假檔案
https://zh.moegirl.org/%E6%88%91%E5%8F%AF%E8%83%BDoo%E4%BA%86%E5%81%87%E7%9A%84xx

有沒有想過什麼都有可能假

檢查 SHA 值這一步可以跳過,如果是經 GOOGLE 搜尋或在其他地方下載檔案,才需要檢查 SHA 值,計算這是不是一個假檔案。(計算 crc sha 是安裝 7-zip 後的附加功能 )

好像是真的

SHA 值對號,不是假檔案。

———————————額外資訊,可跳過的部份 (End)————————————

設定 PortableGit 在 cmd 使用︰


解壓位置

下載回來後,點擊解壓,選取解壓位置。

用 Windows 的Command Line

【win + R】輸入【control sysdm.cpl】。

設定環境變數

進階 ==> 環境變數 ==> Path ==> 編輯... ==> 新增 ==> [解壓的位置]\bin ==> 確定

設定 Eclipse 使用 cmd 工具


用外置工具方法

到 Eclipse,在【Run】順序按【External Tools】 ==> 【External Tools Configurations…】。

在 Eclipse 內的設定

左上角的icon,【New launch configurations】。

 最後設定用 Window 內的 Command Line

改個好記的名稱,例如【Command_Prompt】,再指定要開啟的程式【cmd.exe】,
然後選擇 Working Directory,因為在 【OOAD】 這個資料夾有【.git】,之前有說過,這是給 Git 用的資料夾。

最後按【Run】,這樣就不用每次開啟 Command Prompt 打command【cd A:\javatoybox\OOAD】,轉 Working Directory。

Command Line 設定完成!

打 Command【git show】,如果正確設定的話,會出現圖中輸出,成功準備好測試用環境。

———————————簡易的分隔線————————————

操作及測試︰


查看【Commit Object】


先看一下最新的【Commit Object】是什麼,以下是 Command︰
 git show -s --pretty=raw HEAD
顯示 Commit Object

以黃紫相間標示【Commit Object】包含內容。

commit︰【Commid ID】1517368…標籤著【Tree Object (tree)】987e5f4…
parent︰上一層【Commit Object】是 c4cac844…
author︰【name】 Stanley Tang 【e-mail】<integrityknight gmail.com>【time】1505348552 +0800
註︰time 的顯示方式是跟 Unix timestamp 格式。

查看【Tree Object】


跟據剛剛的【Commit Object】,知道連著【Tree Object (tree)】987e5f4…以下是 Command︰
 git ls-tree 987e5f
顯示 Tree Object

由左至右,Git mode…Object type…SHA-1…file / folder name。

Git mode 數字的代表意義請參考以下網址
https://stackoverflow.com/questions/737673/how-to-read-the-mode-field-of-git-ls-trees-output

Object type︰【Tree Object】只會記錄這一層有什麼檔案,所以還有下一層的話,就會記錄下一層【Tree Object】的 SHA-1。看下一層的【Tree Object】有什麼︰
 git ls-tree 987e5f
顯示 Tree Object 中的 Tree Object

裡面只有一個檔案【txt_test】,【Blob Object】faba297…

查看【Blob Object】


跟據剛剛查到的【Blob Object】faba297…用以下 Command 顯示檔案內容︰
 git show faba297
顯示 Blog Object

只有一句內容,沒什麼感覺……那麼去查一下【.gitignore】這個檔案內容︰
 git show 6143e53
顯示一個字比較多的Blob Object

這個檔有實感得多。

———————————簡易的分隔線————————————

Git Object Model︰


Commit Object 把所有東西都串起來

現在應該知道 Git 用什麼方式把檔案串起來,怎樣做到版本控制。以下是濃縮版的摘要︰

參考資料︰
電子書及網上資源,學習 Git Command Line
http://shafiulazam.com/gitbook/index.html

對應電子書的 Git 程式下載︰
https://github.com/git-for-windows/git/releases

這裡用到的三個 Command︰

Display 【Commit Object】 info
git show -s --pretty=raw [SHA-1]
Display【Tree Object】info
git ls-tree [SHA-1]
Display【Blob Object】info
git show [SHA-1]
———————————簡易的分隔線————————————

操作 Egit 建立 Tag︰


建立新 Tag 試試看

在【Git Perspective】中的【History】View,右鍵想建立 Tag 的 Commit,然後選【Create Tag…】。

寫上資訊

輸入 Tag Name及訊息,按【Create Tag】。

成功建立第一個 Tag

成功建立 Tag。會在【History】及【Git Repositories】View 顯示。

———————————建立 Tag 時的 Tips ( Start )————————————

TIPS 運用Existing Tag

可以在【Existing tags】看到已有的 tags,直接按 tag 作修改或看著舊 tag 建立新 tag,例如要新增一個版本。

增加版本號

版本號 + 1,輸入訊息,然後按【Create Tag】。

———————————建立 Tag 時的 Tips ( End )————————————

操作 Egit 刪除 Tag︰


刪除沒用的 Tag

在【History】或【Git Repositories】右鍵,選【Delete Tag…】。

———————————追加的 Tag Object 測試,可跳過部份 ( Start )————————————

用 Command Line 建立 Lightweight Tag︰


EGit 這個 GUI 介面只能建立 Annotated Tag,如果用 Command 方法去建立 Lightweight Tag 會不會在 Eclipse 顯示呢?

GUI 沒用,Command Line 硬上

先建立Tag,以下是 Command︰
git tag testing_tag_v1.0.3 1517368
Refresh【History】及【Git Repositories】View 後可看到剛剛建立的 Tag。

來感受 Command line 的強大

首先,第一個 command,展示如何顯示 Annotated Tag。
git cat-file tag testing_tag_v1.0.0
第二個 command,用同一個方法嘗試顯示 Lightweight Tag,但失敗了。
git cat-file tag testing_tag_v1.0.3
最後一個 command,展示 Lightweight Tag 標籤著的 Object 內容。
git show testing_tag_v1.0.3

用 Annotated Tag 標籤其他 Object 看看︰


EGit 這個 GUI 只能標籤 Commit Object,如果用 Command Line 將 Blob 及 Tree Object 標籤成 Annotated Tag 會怎樣?

自己試,不詳解

建立 Annotated Tag︰
git tag -a testing_tag_v1.0.4 -m "Annotated Tag for Tree Object" 91a89ef
git tag -a testing_tag_v1.0.5 -m "Annotated Tag for Blob Object" 6358df0
檢視 Tag 內容︰
git cat-file tag testing_tag_v1.0.4 
git cat-file tag testing_tag_v1.0.5
【History】不會出現 Blob 及 Tree Tag,那是只有 Commit Object Type 的 Tag 才會顯示。
【Git Repositories】雖然會顯示 Tag,不過沒有顯示 SHA1 及 Tag Message。

參考資料︰
2.6 Git Basics - Tagging
https://git-scm.com/book/en/v2/Git-Basics-Tagging

———————————額外的 Tag Object 測試,可跳過的部份 ( End )————————————

總結︰


繼 Git Staging 及 Git Object Model 後,到 Branches,最後處理 Conflict。現在學到中段,差不多把 Local Git 基本中的基本玩過一次,距離使用 GitHub 還差一小步,加油!

下一回【GitHub 及 EGit ( PART 5 / 8 ) + Git Branch

沒有留言:

發佈留言

設有留言驗證及審查,檢閱後,才會顯示留言。
本人惰性很高,留言或許會石沉大海。