我想每個工程師應該或多或少都有版控的經驗,然而對於剛進這行的新手工程師們可能並未如此。(事實上,我剛進第一家公司時是沒有太多相關知識,然後就去乖乖啃書了)因此這篇就來介紹一下版控 & git 吧!第一篇會稍微介紹版控跟專案的內容,第二篇則會介紹基礎常用的指令,而第三篇會介紹一下我常用的其他指令喔。
全名為版本控制,主要是控制哪些內容要留、哪些不用。在求學時期,由於頂多是一個小組、三四個人協作,因此彼此詢問一下、確認修改內容也是很方便的事情。不過在出了社會、跟多人協作的狀況下就並非如此了。當兩個人同時對相同檔案做修改時,如果單純地將整個檔案複製貼上,那就容易發生其中一個人的修改被覆蓋掉的情形,因此才需要有版控的機制。而現在主流的版控便是 git 了。
比較講究流程或是比較大的公司裡,會有一套開發流程。在產品或功能開發出來後,會需要經過測試區測試,並且在上線出現問題時有緊急修復的流程等。現今的開發流程有許多都是來自 Git Flow 的改念去變形而成。詳細資訊我附在參考資料喔!
要記得設定專案伺服器與 GitHhub(或是其他版控平台) 之間的 webhook,否則每次程式碼更新後,都會需要去該伺服器的專案底下去下指令 git pull
,如此才會讓線上版本更新。還挺麻煩的。
這個指令是用於設定在本地開發的 git 相關內容,包含你的帳號、 email 與遠端連結。
*查看目前的設定: git config --list
可以用這個指令做遠端的相關設定與修改。此外,可以用 git clone 直接將遠端內容整份抓取下來。
這個指令是萬惡的根源之一,他可以告訴你這個檔案或是這行內容上次是誰改的,讓你順利地去找人吵架。
*查看特定行數: git blame -L 起始行數,結束行數 檔案名稱
Head 代表目前檔案所在的版本位置。一般來說,我們會跟 Head 有關的操作應該只有切換分支的時候( git branch
、git checkout
),因此我們不太會對 Head 本身進行操作,會讓它保持在原本跟分支最新 Commit 點綁定的狀態,所以沒有特殊理由不會用到這區的指令。
*相對位置向上移動(^數量代表移動次數): git checkout 分支名稱^
、 git checkout 分支名稱^^
*相對位置向上移動(~數字代表移動次數): git checkout 分支名~3
*也可以結合以上兩者,例如: git checkout HEAD~^2~2
最後,來跟大家解釋一下很常讓人誤會的內容: Head、branch 以及 commit 點。
Commit 點代表著一次提交,每個 Commit 點有一個自己的 Hash 值,而同一個 Commit 內容在不同分支上不是同一個 Hash 值!因此我們可以直接用 Hash 值去指定操作的分支以及位置。
Head 代表在目前分支上你所停留的位置,注意這並不代表你一定在最新的位置!舉例來說,目前的分支依序有 A、B、C 三個 Commit 點,一般我們會停留在 C 點接續開發,但有時我們會發現 C 的修改已不復使用,那我們可能會選擇回到 B 點去重新開發,而不是在 C 點開發並把修改的調整回去。
最後,在一般的 Git Graph 中,遠端 Branch 的位置通常是在該分支的最新 Commit 點,這是因為初始設定是 Head 與最新位置綁定在一起,因此當有人提交新的內容, Head 便自動往前移動。如果希望分離,那就需要額外下指令才行。
我在參考資料中有附上開源的 git 小遊戲(參考資料第六條),大家有興趣的話可以去做個練習喔~