版本控制大概是所有轉職的人剛成為工程師時最抖的事吧!(至少我是,下個 cmd 指令都會怕一個不小心把整個檔案都刪了哈哈哈)這篇就來簡單分享 Git flow 背後的概念以及一些開發時常用到的超好用指令吧!
對於剛接觸 git 想深入掌握的人,很推薦 高見龍的為你自己學 Git 這本書,裡面講的非常詳盡,而且也涵蓋了許多真實開發上可能會遇到的問題。
Git 是什麼? 一群人一起寫故事
Git 是一個分散式版本控制軟體,其實它只是眾多版本控制的工具之一,但也是最廣泛在開發中使用的工具。Git 可以讓許多人一起開發同一份專案程式碼卻不會有互相影響或是有重疊覆蓋的問題。
我覺得很像是「共編一本長篇故事」,不是即時線上的 google doc 那種隨時看得到大家編輯的內容,而是大家都下載同一份故事大綱(origin 初始專案),分工去完成各自負責的段落。完成自己的段落再把故事上傳 (push 自己的分支)到最初的那份大綱裡,當然上傳時要先通過審核(提出 Merge Request)才能加入故事中,不然可能會有不合邏輯的劇情沒被發現。
在你編輯的同時可以自己掌握進度,並且依據段落 存下紀錄(commit 紀錄時間與修改內容),隨時可以切換回去看看自己那個紀錄做了哪些修改。若你更改的內容與其他人上傳的內容有重疊時,也會依照優先順序,提醒後面才上傳的人說「你改的段落跟別人衝突(conflict)!」,那就要思考到底要以誰的故事為主呢?
我們也可以有很多階段的故事同時並行,例如草稿、校閱、正式印刷版 (就像開發時不同環境的分支 Branch) ,有了這些分支我們可以先完成部分草稿內容,上傳到校閱版本給校正人員確認,並在草稿階段修改再更新到校閱版,越往上層推進錯誤率越低,也能控制好不同的版本,想要看時也可以隨時 切過來看(切換分支、pull 下來)。
簡單來說就是一群人共編但又不影響彼此,而且可以很好的控制不同版本、很好的保存每段修改紀錄,這就是 Git 幫得大忙!
圖解 Git 與 cmd 指令
此圖是我整理出來常見的 Git 與 Git 指令背後所代表的意義,從左到右就是我們平常在自己的 Local 開一個 branch,然後透過編輯器(開發環境)寫完之後,透過 hash 的方式存成一個個獨一無二的 Commit,然後再把這個 branch 推上 origin 遠端資料庫的分支做備份,其他一起寫程式的同事也是如此。
而從右到左則是我們把遠端的程式碼透過 clone 把整個專案下載起來,或是純粹要抓取新的變更的話就用 pull 的方式將程式碼從遠端拉回自己的開發環境,繼續在最新的版本上開發。圖中的指令分別能夠幫我們達成這些目的,可以直接在 terminal 用 cmd 完成。
如果很需要圖像化(GUI)的工具輔助的話,目前我用的是一款叫做 Sourcetree 的 GUI 工具,他會把每一個分支和每一個 commit 都圖像化,幫助我們透過軟體切換分支、新增 Commit、掌握進度。當然 vscode 這類型編輯器其實也都有一些 GUI 的套件,例如 Git Graph,讓你不用下載 GUI git 管理軟體也能看得清楚。
超實用的小技巧:git 指令
1. git rebase
我們平常的習慣會是從最新的版本開一個新的分支去完成開發項目,但是隨著許多 co-work 的人和新的程式碼進去版本裡,你手上的版本可能就不再是最新的,甚至會差很多,這種情況下可以在自己的分支下 git rebase 版本 (e.g git rebase dev),這樣你的程式碼就會重新在最新版本上產生新的 commit,好處是這樣通常在要 Merged 的時候比較不容易有衝突,畢竟是最新的版本了。
2. git cherrypick
我都稱他為撿櫻桃,每一個 commit 都像是一顆顆櫻桃,cherrypick 可以讓你在當前的 Branch 去撿任何一個 Branch 的 commit,在要特別挑出一些功能和到不同版本時非常方便。
3. git reflog + git reset #hash number
還原 commit 最好用的大絕就是 git reflog 搭配 git reset,git reflog 可以列出從近而遠的 commit 以及對應的 hash 值,選到自己想還原到哪一個 commit 之前就把該次 commit 的 hash 複製起來,接著按鍵盤 q 離開 reflog,然後就可以下 git reset 指令,還原 commit 囉!而且不用擔心的是,還原之後的變更也都會保留在暫存區,不會直接刪除。
4. stash
是我很常用的招數,手邊如果做到一半但是還不足以變成一個 commit 時我就會先加到 stash 暫存區,忙完別的 feature-branch 之後再把 stash 加回來繼續做,只是要注意的是 Untracked 的檔案是沒有辦法預設存到 stash,例如新增的 assets,source tree 前方有個?的就是 Untracked 的,需要額外加上 -u。
最後推薦一個 vscode 套件「git blame」,他能夠幫助你查看每一行程式碼最後編輯的作者、時間以及 commit 的名稱,就像下圖的範例。但記得目的不是要你去責怪寫程式的人啦哈哈哈,主要是在看不懂要問的時候很方便,可以直接找到對的人詢問(前提是他還沒離職 XDD)