版本管控
Git、Repository
Last updated
Git、Repository
Last updated
系統開發通常是一種PDCA(Plan-Do-Check-Action)的過程,這也就意味者原始碼會因為需求、重構、協同開發等因素而有許多的版本,因此如何管理這些版本, 方便開發者追蹤原始碼,了解系統軟體的歷史變化,就需要版本控制系統來幫忙了。
一般來說若開發者修正了 3 個程式臭蟲,就得有 3 個版本被寫入儲存庫,而不要全部修正才儲存一個版本,傳統使用集中式版本控制系統若沒辦法連到網路,就必須同時修畢 3 個臭蟲後才能提交,而無法追蹤這3 次修改的變化,而分散式版本控制系統 (Distributed Version Control System) 除了遠端共享的儲存庫以外,在每一個開發者本機端還設計了一個本地端儲存庫(Repository),開發者不須透過網路便能提交新版本的程式碼到本機端儲存庫,等到需要將本機端儲存庫上資料同步到遠端儲存庫時,才需要使用網路。
目前最流行的分散式版本控制系統是 git ,是 Linus Torvalds 在 2005 年為了管理 Linux 核心所創造,git 可以有效處理龐大的專案,而且專案合併與分支也十分有效率。
本教學預設在 Windows 平台操作,請先安裝 VS code 與 Git for Windows。
VS code 需要調整的安裝選項請參考下圖
Git 需要調整的安裝選項請參考下圖
Git 的版本儲存庫分為本地端儲存庫(Local repository)與遠端儲存庫(Remote repository)。
本地端儲存庫:為了方便個人進行版本控制之用,會在自己的專案目錄下配置的儲存庫。
遠端儲存庫 :為了讓多人使用而建立的儲存庫 ,需透過網路來上傳自己的修改內容或取得他人的修改內容,需有專用的伺服器。
在此簡單的介紹如何在本地端透過指令 git 來進行基本的版本管控
因為 Git 每次提交都要紀錄提交者的名稱與 Email 資訊,以下指令可針對所有專案做一次全域設定。
可使用命令 git config --list 檢視目前設定,設定檔的位置在使用者家目錄下的 .gitconfig
若要直接編輯上述設定檔,可下達命令
Git 預設的編輯器是 vim,若安裝時沒有更改預設編輯器為 vscode,仍可以下述指令調整:
當然你要先安裝 vscode ,並將路徑加入環境變數 path 中才能生效
對於常用的 Git 指令與參數可以用別名的方式簡化輸入,例如
git init 初始化會建立一個隱藏目錄 .git 用來作為本地端儲存庫,其中的名為 index 的索引檔案,作為記錄專案所有檔案的狀態之用。
若要每個專案各自設定不同的作者,則請在專案目錄下執行下列指令,未設定會抓全域的設定
與專案有關非全域的設定檔位置在 .git/config
查詢當前目錄的版控檔案狀態,例如有檔案被變更、刪除、新增或其他改變。
untracked files:從未被提交過的新檔案,git 只會追蹤(track)被提交(commit)過的檔案修改狀態
staged files:移入暫存區準備要提交的檔案
unmodified files:已提交到版本庫的檔案,代表工作區的檔案與版本庫的檔案一致
modified files: 已提交的檔案被被修改或刪除過,但尚未暫存的檔案
可使用 git add 或 git stage 指令
git add 指令是將指定檔案加入暫存區,而非加入版本控制,因此後續的 Git 版本建議以 git stage 取代 git add。
某些在專案目錄下的檔案,例如執行檔、資料庫帳密設定檔...等,我們並不想被 Git 監控管理,這些檔案在使用 git status 的時候都一直會出現在 Untracked files 中,此時可建立 .gitignore 的檔案,將檔案或資料夾名稱含相對路徑放進去,這樣 Git 就知道這些檔案或資料夾的變動是不需要被管理的。.gitignore 本身也是一個檔案,建立後處於 untracked,也請於確認後加入版本管控。
空白列或者以#開頭的列會被忽略
可使用標準的Glob pattern
可以 / 結尾,代表是目錄
可使用 ! 符號將特徵反過來使用
需放在與 .git 相同層級目錄下
設定的檔案或資料夾必須處於 untracked
若反悔檔案 package.json 不應進暫存區 (請注意該檔從未提交過,是 untracked file),以下指令可將之移出
實務上要將檔案從stage移除,還要考慮該檔案是否提交過(是否已存在於 repository) ,詳情請參考:如何將檔案從stage移除 ?
commit 只會提交已在暫存區的檔案,參數 -m 代表 message,若沒有加上 -m 參數,Git會呼叫文字編輯器出來,一定要使用者輸入本次提交的訊息
針對已提交過的檔案變動後(modified fills),可以不經 stage 一次提交,指令如下 git commit -am "提交後修改"
git log 可以看到過去所有 commit 的紀錄,每個紀錄都有專屬的 commit 代碼
每次提交之後,Git 都會產生一個亂數編號代表該提交點,但我們可以針對比較重要的提交點賦予一個標示標籤(annotated tag),方便未來可以用標籤指定此提交點,通常標籤功能會拿來記錄版本編號。
刪除指定的標籤。
也可以對過去的提交貼標籤,但要指定 commit 編號。
首先要提醒的是,git diff 比對異動只針對加入 Git 版控的檔案,untracked 的檔案是無法比對的。
git diff 可以比較最後一次提交區(HEAD)、暫存區(index, cached, staged)、工作區(working)的所有檔案異動狀態,若要只針對某檔案則可加上檔名。
預設 git diff 會比較工作區與暫存區的差異,但暫存區沒有檔案則會改為比對工作區與提交區的差異。
這個議題比較複雜,特別是 git reset 指令若搞不清楚,千萬別用,建議一定要用指令測試各種情境下的狀況。
git reset 有三種模式 --hard :工作區、暫存區、儲存庫皆還原至reset目標點 --mixed : 此為預設值,暫存區、儲存庫 還原至reset目標點,工作區不變 --soft : 僅儲存庫還原至reset目標點,工作區、暫存區皆不變