--- tags: Django2 --- Git 版本控制系統 ==== ## 版本控制 進行專案開發的時候,在某個時間點完成了一些功能,測試似乎也沒有問題,在接續開發下個功能之前,為了保險起見,通常會將當下功能正常的狀態備份下來,以防後續開發時,因為未預期的情況,導致專案原本正常的功能變為異常,或無法執行時,還可以將專案回復到先前功能正常的狀態。 一般人的直覺做法是將專案資料夾整個複製一份,並在備份的資料夾名稱加上日期註記或是版本號碼來進行管理。有的人為了方便區別各版本間的異動,也許還會加上簡短的文字來說明該版本的備份做了什麼事情,例如: <kbd>![](https://i.imgur.com/m6qwBXH.png)</kbd> 當後續修改專案發生問題時,可以迅速找到最近的備份,接著為了找出專案壞掉的原因,可能還得透過兩個視窗分別編輯新、舊版本的程式,憑印象捲動到最近有修改過的部份進行比對。如果兩個版本間的時間間隔很近,可能還記得修改過哪些地方,但若間隔時間一長,可能就不容易比對了。 我們在開發小型專案的時候,面臨到這個問題就覺得有些頭痛了,像是 Linux 作業系統的核心(Kernel)程式碼之類的超大型專案,超過 2,600 萬行的程式碼,參與的開發者超過 1,000 位,除了要知道哪些地方做過修改,還得知道是什麼人做了哪些修正。因此,需要更聰明的做法來進行版本控制。 Linux 之父 Linus Torvalds 為了解決 Linux Kernel 這項龐大的程式開發計畫在版本控制所遭遇到的問題,而開發了 Git 這項開發協助工具。Git 是一套分散式的版本控制系統,眾多開發者可以分別在自己的電腦上,利用這套系統參與同一份專案的開發。所有修改所做過的變更,可以透過 Git 記錄在各自的電腦上(本地端儲存庫),也可以透過 Git 上傳到共用的開發平臺(像後面會介紹的 GitHub 網站)進行合併。在本地端提交(Commit)變更紀錄時,Git 會自動比對新舊版本間的相異處,同時也會將變更者的身份資訊一併包含在變更紀錄中,因此在多人協作的專案中,就可以得知什麼人做了哪些更動。倘若各自修改不相干的程式碼,Git 會自動合併專案各處的變更,但若多人同時針對同一段程式碼做出更動,Git 在合併時會發現有衝突發生,此時才需要進行人工處理後再合併。 ## 安裝並且設定 Git ### 下載 Git 安裝程式 請先至 https://git-scm.com/ 網站下載 Git 安裝程式 <kbd>![](https://i.imgur.com/XMAQX0a.png)</kbd> 網站會自動偵測你使用的作業系統,在頁面上顯示適合的下載連結。直接點選頁面右下方螢幕圖案內的 「**Download x.y.z for ....**」 按鈕連結到下載頁面。 <kbd>![](https://i.imgur.com/DNfiS9k.png)</kbd> 切換到下載頁面後,應該就會自動依據環境偵測的結果啟動下載作業。如圖所示,切換到下載頁面後,自動跳出了檔案下載的對話框,因為示範用的電腦是安裝的是 64 位元的 Windows 10 作業系統,所下網站自動決定讓瀏覽器下載 `Git-2.21.0-64-bit.exe` 檔案。 ### 安裝 Git 工具包 開啟檔案總管瀏覽下載資料夾,直接執行方才下載的安裝程式,安裝過程中大部份的選項頁面直接使用預設值就好了。只有幾個地方可能需要修改一下: - 指定 Git 預設的編輯器 <kbd>![](https://i.imgur.com/eKiOXsK.png)</kbd> 安裝的預設選項是 `Vim`,這個編輯器對普通使用者來說入門門檻太高,會建議調整成其它選項。像是課程一開始建議大家使用的 `Visual Studio Code` 就是個不錯的選擇。另外選項中也有幾個多數工程師常用的編輯器,如:`Notepad++`、`Sublime Text`、`Atom` 等可以選擇。 要特別說明的是,除了預設的 `Vim` 編輯器,安裝程式會自動安裝之外,其它編輯器都需要事先自行下載安裝好才行噢! <kbd>![](https://i.imgur.com/MUyCopz.png)</kbd> - 額外選項(Extra options) <kbd>![](https://i.imgur.com/WXNICOt.png)</kbd> 這一頁上有一個 `Enable Git Credential Manager` 的選項,預設是勾選的。這個選項的作用是當需要登入遠端的 Git 協作服務(例如後面會介紹的 GitHub 網站)時,第一次會要求輸入遠端的帳號與密碼來存取服務,成功登入時會使用 Windows 內建的憑證管理員向遠端系統註冊一個憑證,後續要再存取同一個遠端服務時,Git 會取用已註冊過的憑證向遠端系統進行證認,省去登打帳號與密碼的步驟。 在正常狀況下,這個機制超方便。但是如果多人在同一部電腦以共用帳號的方式使用電腦,如果這些人當中有兩個人以上會存取同一個遠端 Git 服務的話(例如:都使用 GitHub 來進行專案協作或代管),那這個選項就不適合在那部電腦上啟用。若還是想使用憑證管理員自動認證的方便性,在多人共用一部電腦的情形下,建議還是分別為使用者建立使用帳號,不同使用者在操作電腦時以自己的帳號登入,Windows 的憑證管理員就可以為不同的電腦使用者帳號建立專屬憑證,再向遠端系統註冊,如此一來,以不同的帳號登入電腦,就會使用不同的憑證向遠端系統進行身分認證。 ### 設定 Git ## Git 的基本操作 ### 初始化儲存庫 (`git init`) 如果要使用 Git 為專案進行版本控制,就得為專案初始化儲存庫(Initialize Respository)來建立空的儲存庫。 - 先以檔案總管開啟專案資料夾,以 Django 的專案來說,就是開啟到 `manage.py` 所在的那層資料夾。接著在顯示資料夾內容的空白處按滑鼠右鍵來開啟快顯功能表 <kbd>![](https://i.imgur.com/MEpvmBj.png)</kbd> - 在快顯功能表上點選「**Git Bash Here**」來開啟終端機視窗 <kbd>![](https://i.imgur.com/H1jWJqh.png)</kbd> - 在終端機視窗內輸入以下指令後按下 <kbd>Enter</kbd> ``` bash git init ``` 這個指令會在當前的工作目錄下建立儲存庫,實際上的動作會在當前工作目錄下建立一個名為 `.git` 的隱藏資料夾,用這個資料夾來記錄專案的變更。 <kbd>![](https://i.imgur.com/g4i0yUN.png)</kbd> 如圖所示,在輸入 `git init` 指令之後,在專案資料夾下多了一個 `.git` 的資料夾。 ::: info :bulb: **在檔案總管顯示隱藏的檔案或資料夾** 如果在檔案總管中沒看到 `.git` 資料夾出現,有可能是因為它的隱藏屬性能緣故,而檔案總管預設不會顯示被隱藏的項目。可以點按一下檔案總管的「檢視」頁籤,再勾選「隱藏的項目」,讓檔案總管顯示有設定隱藏屬性的檔案或資料夾: <kbd>![](https://i.imgur.com/3NJjRw7.png)</kbd> ::: ### 設定 Git (`git config`) 要修改或指定 Git 的設定的話,可以用 `git config` 指令,基本語法如下: ``` bash git config 選項名稱 選項值 ``` Git 可調整的選項很多,但一般人需要調整或指定的只有幾個,其中最重要的是要指定使用者的身分識別資訊,因為 Git 在記錄變更時會同時記錄使用者的身分資訊,所以要使用 Git 來做專案版本控制時,這個是必要的設定。身分資訊包含兩項:使用者的 `E-Mail` 與 `名稱`。 沿用方才開啟的 Git Bash 終端機視窗,以 `git config` 來設定使用者資訊: - 指定使用者電子郵件信箱 ``` bash git config user.email "使用者的電子郵件信箱" ``` 例: ``` bash git config user.email "dreamer@dcsh.tp.edu.tw" ``` - 指定使用者名稱 ``` bash git config user.name "名稱" ``` 這裡的使用者名稱不是指你的真實姓名,只是用來標示使用者的字串,要放什麼都可以,建議使用你希望別人如何稱呼你來當作使用者名稱。例: ``` bash git config user.name "Dino Wei" ``` 設定完畢後,之後提交(Commit)專案變更時,就會將使用者身分資料附加在紀錄中。 ::: info :bulb: **全域指定使用者身分資訊** 如果每個使用者使用獨立帳號來登入電腦進行操作的話,也可以考慮全域指定使用者身分。這裡所說的全域是指在該使用者帳號之下,若沒有為儲存庫進行設定時,Git 會使用的預設設定。 使用全域的方式為登入電腦的使用帳號指定該帳號預設的身分資訊後,就不需要分別在每個儲存庫設定使用者身分識別資料了。全域設定的方式很簡單,就是在 `git config` 後多加上 **`--global`** 參數即可,例: ``` bash git config --global user.email "dreamer@dcsh.tp.edu.tw" ``` ::: ### 指定版本控制要排除的檔案 (`.gitignore` 檔案) 如果專案內有部份的檔案不需要或不希望加入版本控制的範圍的話,可以在專案資料夾中建立 `.gitignore` 檔案,將欲排除的檔案名稱列在該檔案內。 以 Django 開發的專案來說,只要曾經啟用過專案的網站(用 `python manage.py runserver` 將專案網站跑起來),Python 為了加快後續執行的速度,會自動為執行過的 `.py` 檔案建立執行快取 `.pyc` 檔案,這些檔案會被放在 `__pycache__` 資料夾下,像這個就可以設定為排除的檔案。例如先前測試過的個人數位助理的專案,你應該會在專案的每個應用程式資料夾中都看到 `__pycache__` 的存在: <kbd>![](https://i.imgur.com/vSHt4db.png)</kbd> 另外,我們以 Visual Studio Code 編輯器以開啟資料夾的方式來開發專案,它也會在專案資料夾中建立一個名為 `.vscode` 的隱藏資料夾,用來暫存編輯的狀態。 <kbd>![](https://i.imgur.com/VJMwpiN.png)</kbd> 像專案用到的資料庫檔案 `db.sqlite3` 也不應該列入版本控制,除非也想要記錄資料庫內容的變更。 如果想排除上述檔案或資料夾的話,請在專案的最上層資料夾(也就是 `manage.py` 所在的資料夾)下,建立 `.gitignore` 檔案,並鍵入以下內容: ``` = __pycache__ .vscode db.sqlite3 ``` 存檔之後,Git 就會忽略 `.gitignore` 清單中所有檔案的變更。 ### 查看專案目前與前一次提交的版本間的異動狀態 (`git status`) 如果想查看一下異動狀態,可以使用 `git status` 這個命令來列出自前一次提交之後,有變更過的檔案(或資料夾)的清單,例: <kbd>![](https://i.imgur.com/WfmW4es.png)</kbd> 上圖的「**Untracked files**」指的是目前在儲存庫中,尚未記錄過的檔案(或資料夾),應該是上次提之後才新增或建立的檔案。目前示範的個人數位助理的專案,才剛透過 `git init` 建立儲存庫而已,尚未提交過任何版本變更,所以目前專案資料夾內的所有檔案與資料夾都是未追蹤狀態。 再來看另外一個已有提交記錄,但修改過部份檔案的例子: <kbd>![](https://i.imgur.com/ELPydS7.png)</kbd> 「**Changes not staged for commit**」的意思是,有偵測到以下列出的檔案變更,但是這些變更還沒被列入提交清單。Git 會維護一個檔案變更的索引清單,這個清單中會記錄待提交的變更有哪些,沒被列入索引清單的變更,不會被列入版本提交的範圍。也就是說,只要變更記錄沒有被列在索引清單上,即使檔案真的做過了修改,在提交的時候,不會記錄該檔案該次的變更狀態。 檔案前方的 **`modified`** 是用來標示後面的檔案的變更狀態,除了 **`modified`**(已變更) 的狀態之外,還有 **`new file`**(新增的檔案)、**`deleted`**(被刪除了)...等等。 <kbd>![](https://i.imgur.com/vfMbwJX.png)</kbd> 而被列在「**Changes to be committed**」之下的檔案,表示這些檔案的變更紀錄已經被列入待提交的索引清單了,提交的時候,這些檔案的變更都會被保存下來。 ::: info :bulb: **小提醒** 被列入 `.gitignore` 內的檔案或資料夾,Git 不會去追蹤它們的狀態。因此 `git status` 不會列出這些檔案或資料夾的異動狀態。 ::: ### 將檔案的變更狀態列入待提交索引清單 (`git add`) 前面的 `git status` 提過,要被列入待提交索引清單的這些檔案的變更,在提交時才會被保存下來。要將某個檔案本次的異動加入待提交索引,需使用 `git add` 命令,語法如下: ``` bash git add 欲加入索引的檔案或資料夾名稱 ``` 例如,同樣以先前的個人數位助理專案為例,在專案的最上層使用下面的指令: ``` bash git add journal ``` 表示要將 `journal` 整個資料夾內的變更加入提交索引清單。執行完後,以 `git status` 觀察狀況: <kbd>![](https://i.imgur.com/Qv1xMDC.png)</kbd> 只有 `journal` 資料夾內的檔案異動被加入提交索引清單。 另外,也可以使用 `*` 萬用字元,例: ``` bash git add *.html ``` 表示將所有副檔名為 `.html` 的檔案變更加入提交索引清單。以 `git status` 再觀察執行的結果: <kbd>![](https://i.imgur.com/khshSIJ.png)</kbd> 不過要將專案內的所有檔案都加入提交索引清單,每次都要將整個專案的檔案或資料夾以 `git add` 一一加入,這未免也太浪費時間了吧?沒有直接將整個專案加入的方法嗎? 有噢!有兩個方式: - `git add .` `git add` 後面接的可以是檔案,也可以是資料夾。將工作目錄切換到專案最上層的資料夾,然後以 `git add .` 將目前工作目錄以下所有檔案變更都加入待提交索引清單。 ::: info :bulb: **`git add` 後面的 `.` 的指的是目前所在的工作目錄。** 順帶一提,如果檔案路徑中出現了 `..` 指的是它的上一層資料夾。 ::: - `git add --all` 將整個專案資料夾下的所有檔案變更加入待提交索引清單。只要當時的工作目錄在專案資料夾心下任一層皆可以,不需要在專案的最上層。 ::: info :bulb: **`.gitignore` 內條列的檔案與資料夾仍然會被排除噢!** ::: ### 將檔案變更狀態由待提交索引清單中剔除 (`git rm --cache`) 如果要將某個檔案或資料夾的變更移出待提交索引清單,例如:其它部份都已經完成了,但某個檔案或資料夾的內容正改到一半,但是已經用 `git add --all` 將整個專案的檔案變更都加入待提交索引,此時就可以用這個指令將暫時還不想紀錄變更的檔案剔除: ``` bash git rm --cache 欲剔除的檔案或資料夾 ``` 例,剔除 `templates` 資料夾下所有頁面範本檔案的變更: ``` bash git rm --cache templates ``` ### 提交版本 (`git commit`) Windows 作業系統中有一個名為「系統還原」的功能,在懷疑因為不慎安裝到某些惡意程式,或因為不明原因導致操作時出現問題,若還可以開機進入 Windows,還可以使用「系統還原」的功能試著將作業系統回復到之前所建立的「還原點」的狀態。一般來說,Windows 在安裝更新或使用者安裝程式時,會試著自動建立還原點,將當下的系統狀態保存下來,日後若有需要,就可以將系統還原到還原點當時的狀態。 <kbd>![](https://i.imgur.com/ohOaK76.png)</kbd> <kbd>![](https://i.imgur.com/BZx5JeD.png)</kbd> 而 Git 中的提交版本,類似 Windows 中建立系統還原點的作用,只是 Git 可以自行擇定需要紀錄的異動範圍,而 Windows 系統還原則是全由系統決定。前面提過的,透過 `git add` 指令加入待提交索引清單並不會真正紀錄下來,這個動作只是在維護一張清單,標示有那些變更需要保留。一直要到正式提交變更,待提交索引清單紀錄到的這些檔案變更,才會真正被保留下來,成為一次的版本變更紀錄。 在提交版本的時候,為了日後容易識別版本間的差異,Git 會要求輸入一個「提交訊息」來簡要說明此次提交的版本。通常提交訊息裡會放本次提交做了哪些事情,比方說新增了某某功態,修正了某項錯誤...等,有了「提交訊息」的提示,比較容易在已提交版本間找到需要的版本紀錄。 要建立提交版本的話,可以在已建立儲存庫的專案內使用以下指令: ``` bash git commit ``` 接著 Git 會自動開啟安裝時指定的預設編輯器,讓使用者輸入提交訊息: <kbd>![](https://i.imgur.com/d8ATFK6.png)</kbd> 輸入完成後,記得存檔後再關閉編輯器。如果提交成功,在主控臺視窗上應該會看到類似下面的訊息,會列出提交訊息以及此次提交所記錄的檔案變更清單: <kbd>![](https://i.imgur.com/eIgERc8.png)</kbd> ::: info :bulb: **一定要留下提交訊息,否則版本提交會被中斷** 若是忘了存檔或未撰寫提交訊息,就將編輯器關閉的話,會中斷版本提交的動作: <kbd>![](https://i.imgur.com/djU00G2.png)</kbd> 要遇到這個狀況,只要重新執行一次 `git commit` 再提交一次即可。 ::: 在提交版本的時候,也可以直接指定提交訊息,就不需要開啟編輯器了。語法如下: ``` bash git commit -m "提交訊息" ``` 例: ``` bash git commit -m "新增日誌與支出紀錄功能" ``` ### 列出版本提交紀錄 (`git log`) 要列出已經提交過的版本有哪些的話,可以使用以下指令: ``` bash git log ``` 然後 Git 會查找提交紀錄,由新至舊一一列出,例: <kbd>![](https://i.imgur.com/lG9Sy0M.png)</kbd> 為了方便示範,特意將專案內的 `templates` 資料夾整個刪除後再提交了一次版本,所以這邊會看到兩次版本提交紀錄,每一筆版本提交紀錄包含了以下資訊: - 版本的識別 ID 黃色 commit 後面那串 16 進位的數字就是該提交版本識別編號,如果後續想要對某個特定的版本進行操作(例如等一下會提到的 `git checkout`)的話,就需要提供該版本的 ID。 - 提交者的資訊(**Author**) - 提交時間(**Date**) - 提交訊息 ::: info :bulb: **版本識別 ID 後面的 (HEAD -> master) 是做什麼用的?** **HEAD** 用來標示現在專案是處在哪個版本的狀態下,而 `->` 後方的 **master** 是所在的分支名稱。分支是比較進階的用法,可以根據不同的用途,為專案建立不同的分支,像是:正式版本、測試版本、錯誤修正...等,這邊我們不打算討論,有興趣可以自行查閱相關資料。 以上面的範例圖來說,目前的專案是處在 **master** 分支下的 **d043936...** 這個版本的狀態。 ::: ### 將專案的狀態還原到已提交過的任何一個版本 (`git checkout`) 當因為某些原因,需要將專案的狀態切換到已提交過的版本,可以使用 `git checkout` 指令,語法如下: ``` bash git checkout 版本識別ID ``` 需要特別提出的是,由於完整的版本識別ID太過冗長,Git 允許我們只登打識別ID前面幾個符號就好,例: ``` bash git checkout c200a67 ``` 至少需要登打前 4 個符號,除非版本識別 ID 的前 4 個符號有重覆的狀況,不過這種狀況應該很少發生,如果真遇到就多輸入幾個符號,直到能篩選出唯一一個版本為止。 前面提到,示範的專案已提交了兩個版本,在最新的版本中,不慎刪掉了存放所有頁面範本的 `templates` 資料夾: <kbd>![](https://i.imgur.com/QLcg8ti.png)</kbd> 現在想將專案還原到剛做完新增日誌與支出紀錄功能的那個狀態,可以切換到 `c200a67` 這個版本: ``` bash git checkout c200 ``` 這邊示範的時候,只輸入了版本ID的前 4 碼 `c200`,Git 仍然很聰明地找到了唯一符合的版本: <kbd>![](https://i.imgur.com/koQrFYx.png)</kbd> 之前被刪掉的 `templates` 資料夾回來了! ::: info :bulb: **列出所有版本提交紀錄** 再重新查看一下版本提交紀錄,發現只剩目前所在的版本,第二個刪掉頁面範本的版本紀錄不見了: <kbd>![](https://i.imgur.com/Yy0wvkU.png)</kbd> 原因是因為,`git log` 預設只列出目前版本之前的版本紀錄。若要將目前所在版本之後的版本紀錄一併列出的話,需附加 **`--all`** 參數,例: ``` bash git log --all ``` <kbd>![](https://i.imgur.com/XibYXIM.png)</kbd> 兩個版本都列出來了,而 `(HEAD)` 標記現在在 `c200a67` 這個版本上。 ::: 如果要將專案再切換回某分支最新的一個版本的話,除了使用版本ID之外,還有一個方式: ``` bash git checkout 分支名稱 ``` - 由於專案裡只有一個預設的 `master` 分支,所以`分支名稱`可以替換為 `master`,例: ``` bash git checkout master ``` 如果有建立其它分支的話,`master` 可以改成欲切換的其它分支名稱。 <kbd>![](https://i.imgur.com/ZGGtxnc.png)</kbd> ## 在 Visual Studio Code 中操作 Git 如果覺得指令很難記,先前推薦過的 Visual Studio Code 編輯器有將 Git 的版本控制功能整合進來,可以讓使用者直接在編輯器的介面下執行 Git 相關功能。 ::: warning :warning: Visual Studio Code 整合了 Git 功能的功能指的是它可以幫忙下 Git 的命令,但是使用者仍需額外安裝 Git。若未另行安裝 Git,雖然 Visual Studio Code 下了命令,少了實際執行的工具,是沒有效用的。換句話說,只是透過 Visual Studio Code 來幫忙操作 Git 工具而已,在安裝 Visual Studio Code 時並不包含 Git 相關工具。 ::: 請以開啟資料夾的方式使用 Visual Studio Code 來操作專案資料夾,先以檔案總管開啟專案資料夾,以 Django 的專案來說,就是開啟到 `manage.py` 所在的那層資料夾。接著在顯示資料夾內容的空白處按滑鼠右鍵來開啟快顯功能表: <kbd>![](https://i.imgur.com/JfPLdxI.png)</kbd> 然後點選功能表上的「**Open with Code**」。 <kbd>![](https://i.imgur.com/DIRVgkc.png)</kbd> ### 初始化儲存庫 點按 Visual Studio Code 編輯器左方由上往下數第 3 顆快速切換按鈕,將操作面板切換到原始碼控制(Source Control)模式,然後在原始碼控制面板上,按下其後方的按鈕來初始化儲存庫(Initialize Respository): <kbd>![](https://i.imgur.com/VRWyly4.png)</kbd> 接著選擇要建立儲存庫的資料夾。Visual Studio Code 會將目前開啟的資料夾列為第一個選項,直接點選它就好: <kbd>![](https://i.imgur.com/zwBOlJm.png)</kbd> 如果資料夾中已經有檔案存在了,操作面板會列出偵測到有變更的檔案,基本上資料夾下所有的檔案都會被列出: <kbd>![](https://i.imgur.com/D5mjKB3.png) </kbd> 檔案名稱後面會以一個英文字母標示該檔案的修改狀態: |狀態字母|意義| |-|-| |`U`| `Untracked`,該檔案尚未被追蹤過。意思在過往的版本中沒有記錄過此檔案。| |`A`| `Added`,該檔案為新檔案。<br/>在過往版本中沒有記錄過此檔案,目前已將此檔案列入提交索引。| |`M`| `Modified`,該檔案自上次版本提交後有被修改過。| |`D`| `Deleted`,該檔案自上次版本提交後被刪除了。| 若按左方第一顆快速切換按鈕,可切換為檔案總管模式,在此模式下,同樣會標示檔案的修改狀態: <kbd>![](https://i.imgur.com/NbRIzyX.png)</kbd> ### 指定版本控制欲排除的檔案 在 Visual Studio Code 的檔案總管模式下,在操作面板的空白處按滑鼠右鍵叫出快顯功能表,再點選「**New File**」在開啟的資料夾最上層建立新檔案: <kbd>![](https://i.imgur.com/uza9wCJ.png)</kbd> 接著在面板上會出現一個空白的文字框,輸入要新增的檔案名稱為 `.gitignore`: ![](https://i.imgur.com/zBuBax6.png) 輸入完畢後按 <kbd>Enter</kbd> 鍵,Visual Studio Code 會自動在右方編輯區開啟該檔案。之後,請將欲排除的檔案一一列入 `.gitignore` 內: ``` __pycache__ .vscode db.sqlite3 ``` 輸入完成後,按 <kbd>Ctrl</kbd>+<kbd>S</kbd> 儲存。檔案總管面板上,被排除的檔案或資料夾後方的修改狀態就變成空白的: <kbd>![](https://i.imgur.com/j0DfHvI.png)</kbd> ### 提交版本 在開發專案的時候,通常是針對整個專案下的所有檔案進行版本控制,需要排除的直接列在 `.gitignore` 檔案中。在提交版本的時候,最常做的也是將所有非排除的檔案的變更都提交為一次版本紀錄,不太需要一一挑選哪些要記,哪些不記。在 Visual Studio Code 內要以這樣的方式提交版本的話,步驟如下: 1. 先按左方第 3 顆快速切換按鈕切換為原始碼控制模式 2. 在原始碼控制面板上的文字框輸入提交訊息 3. 最後按控制面板最上方的勾勾(:heavy_check_mark:)按鈕來提交版本 <kbd>![](https://i.imgur.com/TlKNUlR.png)</kbd> 4. 應該會看到一個對話框,詢問是否要自動將所有檔案加入索引清單再提交版本 <kbd>![](https://i.imgur.com/cy5JUeD.png)</kbd> 直接按「**Yes**」就好,如果覺得每次提交都要按鈕太麻煩,也可以按「**Always**」,以後就會自動進行這個操作。 ::: info :bulb: **Visual Studio Code 下的 git add 與 git rm** 如果真的有特殊需要,只想先提交部份檔案的更新時,在 Visual Studio Code 也可以挑選哪些變更要列入提交索引清單。切換到原始碼控制的模式後,會在面板上列出偵測到哪些檔案有變更,此時將滑鼠游標移至檔案上面時,該檔案後方會多出一個 <kbd>+</kbd>,點按它就可以將其加入提交索引清單: <kbd>![](https://i.imgur.com/Rp9fJdQ.png)</kbd> 被加入提交索引的檔案會被改列在「**STAGED CHANGES**」之下,這裡列的就是提交索引清單的內容: <kbd>![](https://i.imgur.com/LHnwpOJ.png)</kbd> 如果將游標移到 **STAGED CHANGES** 下的檔案,則該檔案後方會出現 <kbd>-</kbd>,點按它就可以將這個檔案移出提交索引清單。 <kbd>![](https://i.imgur.com/Zdldr6V.png)</kbd> 要注意的是,當提交索引清單「**STAGED CHANGES**」的內容不是空的,此時按面上最上方的勾勾 :heavy_check_mark: 只會將索引清單的內容提交為一次的版本紀錄噢! ::: ### 查看提交版本紀錄 Visual Studio Code 的內建功能沒辦法直接查看已提交的版本紀錄,需安裝額外的擴充套件。 #### 安裝 Git History 擴充套件 安裝擴充套件的步驟如下: 1. 先按左邊第 5 顆快速切換按鈕,切換到擴充套件面板 2. 在擴充套件面板上面的文字輸入框輸入搜尋關鍵字,在這個例子中可輸入「**git**」來篩選 Git 相關套件 3. 符合的套件會列在面板下方。找到欲安裝的套件,點按其右下角的「**Install**」按鈕即可進行安裝 <kbd>![](https://i.imgur.com/1vl8kdY.png)</kbd> #### 使用 Git History 套件 先以快速切換按鈕切換至檔案總管面板,然後在面板檔案列表的空白處按滑鼠右鍵叫出快顯功能表,然後點按「**Git: View File History**」: <kbd>![](https://i.imgur.com/veAPV6L.png)</kbd> 接著在中央編輯區會多一個分頁,顯示本專案的版本提交紀錄: <kbd>![](https://i.imgur.com/61iHttb.png)</kbd> 在欲查看的版本提交紀錄上點按一下,會顯示該次版本提交有哪些檔案有變更: <kbd>![](https://i.imgur.com/rZSua14.png)</kbd> ### 將專案還原到已提交的任何一個版本 承上,在透過 Git History 套件檢視已提交的版本紀錄時,點按該版本紀錄後方的 ![](https://i.imgur.com/XHsDF4F.png) 按鈕來開啟版本相關功能的選單,點選「**Checkout (xxxxxxx) commit**」即可將專案還原到該版本提交時的狀態。 <kbd>![](https://i.imgur.com/kpwJQ1X.png)</kbd> 切換版本後如果關閉了「**File History**」分頁,重新開啟版本提交紀錄時可能會發現切換版本之後的提交紀錄都不見了。此時可以由上方的篩選工具,選擇檢視所有分支(**ALL branches**)的版本提交紀錄: <kbd>![](https://i.imgur.com/tquqliu.png)</kbd> ## GitHub 分享 GitHub 是一個利用 Git 進行版本控制提供專案原始碼代管服務的網站,目前許多開放原始碼軟體都使用 GitHub 的服務來分享專案,或與來自世界各地的開發者進行協作,共同進行專案開發。有些人使用 GitHub 的方式是,將它當成一個專案原始碼的備份處,或者做為自己在不同設備間(例:在公司的電腦,與在家裡的電腦,甚至筆電與桌機之間)開發同一個專案的同步機制。 ### 申請 GitHub 帳號 先前所提到關於 Git 對專案的所有版本紀錄都是保留在該部電腦上,如果想將專案上傳到 GitHub 網站,則需要先擁有一個可以存取 GitHub 網站的帳號。 - 以瀏覽器連上 GitHub 網站 https://github.com/ ,按下網站右上角的「**Sign Up**」按鈕可以免費申請帳號: <kbd>![](https://i.imgur.com/AVa79Dv.png)</kbd> - 在帳號申請頁面,先填寫相關欄位: - **Username**: 你想使用的帳號名稱,不能與其他使用者重複 - **Email address**: 你的電子郵件信箱 - **Password**: 你想使用的密碼 - **Verify account**: 這是用來驗證帳號申請者是否為「真人」 填完後,請按下「**Create an account**」按鈕 - 第二步選擇訂閱方案:這邊直接用預設值,選用免費(Free)方案就好,直接按「**Continue**」 <kbd>![](https://i.imgur.com/XPfuGko.png)</kbd> - 第三步是一份調查問卷,不想填的話,可以直接將頁面捲到最下面點選「**skip this step**」跳過這一步驟 <kbd>![](https://i.imgur.com/33uMIMg.png)</kbd> - 最後一步,請至方才註冊時填寫的電子郵件信箱收取認證信,點選信件裡的按鈕完成電子郵件信箱驗證 <kbd>![](https://i.imgur.com/0N1DelX.png)</kbd> ### 在 GitHub 建立儲存庫 - 登入 GitHub 後,點選右上角的 <kbd>+</kbd>,再從下拉選單點選「**New respository**」來建立儲存庫 <kbd>![](https://i.imgur.com/5NcsYey.png)</kbd> - 下一個頁面要設定儲存庫的屬性: - **Respository name**:儲存庫的名稱,不要與自己的其他儲存庫同名即可,必填欄位。 - **Description**:關於此專案的簡單說明,選填欄位可空白。 - 接著是儲存庫的可見性,「**Public**」表示要將此儲存庫公開,所有人皆可取用;「**Private**」表示此為私有專案,可以指定哪些人可以存取此儲存庫,另外,私有專案需付費才可使用。一般請維持選用預設的「**Public**」,將儲存庫公開。 ::: info :bulb: GitHub 的免費方案僅能建立公開儲存庫,如果想要免費建立私有儲存庫的話,可以使用另外一家廠商 BitBucket 提供的服務。 ::: - 最後再按「**Create respository**」,即可建立儲存庫 <kbd>![](https://i.imgur.com/y2wNlpJ.png)</kbd> ### 將本地端專案上傳到 GitHub 建立完成後,儲存庫尚未有任何內容,GitHub 會提示接下來可以做些什麼事在儲存庫加入內容: <kbd>![](https://i.imgur.com/DNodgJq.png)</kbd> 我們可以採用第二種方式,將本機端的儲存庫上傳到方才在 GitHub 新建的儲存庫,需要在本地端執行的 2 個指令,Git 也很貼心地直接列在頁面上了。以此圖為例,需在本地端執行以下 2 個指令: ``` bash= git remote add origin https://github.com/dcsh314/assistant.git git push -u origin master ``` 這 2 個指令所代表的意義如下: - ++第 1 行++,在本地端儲存庫新增一個遠端儲存庫,也就是本地端電腦裡開發的專案指定遠端對應的儲存庫,這個遠端儲存庫被命名為 `origin`,而遠端儲存庫的位址為 `https://github.com/dcsh314/assistant.git` - ++第 2 行++,將本地端儲存庫的 `master` 分支上傳到遠端 `origin` 儲存庫 可直接從網頁上複製那 2 行指令,然後在電腦裡已使用 Git 進行版本控制的專案資料夾上開啟「**Git Bash**」視窗,然後將方才複製的指令貼上。 或者,已經使用 Visual Studio Code 開啟專案資料夾,可使用 <kbd>Ctrl</kbd>+<kbd>`</kbd> (數字鍵 1 左邊的那個符號)組合鍵打開 Visual Studio Code 的終端機,再以滑鼠右鍵將指令貼上執行: <kbd>![](https://i.imgur.com/kk4Bk3K.png)</kbd> 在執行第 2 行指令時,需要登打 GitHub 網站的帳號與密碼,若帳號密碼驗證成功,且該帳號有權限可以寫入遠端儲存庫,應該會看到類似下圖的訊息: <kbd>![](https://i.imgur.com/Lk2K4HP.png)</kbd> 這樣就表示已經成功將專案在本地端的儲存庫與 GitHub 上的遠端儲存庫建立了對應關係。 #### 將本地端後續建立的版本紀錄上傳到遠端 日後在本地端提交了新版本之後,也可以透過下面的指令將本地端新的版本紀錄推送到 GitHub 對應的儲存庫: ``` bash git push ``` 若使用 Visual Studio Code 的話,則可在原始碼控制的面板上,點按面板右上方的 <kbd>...</kbd> 按鈕來展開功能選單,再選擇「**Push**」將版本紀錄「推送」到遠端: <kbd>![](https://i.imgur.com/acTwpLh.png)</kbd> ### 將遠端儲存庫複製(Clone)到本地端 前面示範了如何將本地端現有專案的儲存庫上傳到遠端(GitHub),換個方向,如果想將遠端已有內容的儲存庫複製一份到本地端的話,要如何進行?舉個例子來說,你可能在學校開發某個專案,也透過前面的方法做了版本控制並上傳到 GitHub;現在回到家,想接續學校正在做的專案繼續開發,但家裡的電腦目前還沒有該專案時,就可以用接下來介紹的方式,將 GitHub 上的專案儲存庫下載一份到本地端。 首先要先找到要複製的專案的網址,登入 GitHub 後,點選欲複製的儲存庫,然後將瀏覽器的網址列的內容複製起來,此時的網址應該會像這樣的格式: ``` https://github.com/使用者帳號/儲存庫名稱 ``` 例: ``` https://github.com/dcsh-dreamer/assistant ``` 接著在你想要存放專案的資料夾開啟一個 Git Bash 終端機視窗,然後以下列命令格式下載專案: ``` bash git clone 遠端專案網址 ``` 例: ``` bash git clone https://github.com/dcsh-dreamer/assistant ``` 下載完成後,就可以直接以 Visual Studio Code 開啟方才下載的專案資料夾繼續進行開發。不過可能得在專案下先以 `git config` 設定使用者 E-Mail 與使用者名稱,才能提交版本紀錄。 ::: info :bulb: **小提示: 複製(clone)下來的專案不需指定遠端對應儲存庫** 以 `git clone` 指令自遠端下載的專案儲存庫不需要再指定遠端對應的儲存庫,即可直接以 `git push` 將本地端後續建立的版本紀錄上傳到遠端。 ::: ### 將遠端對應儲存庫新的版本紀錄更新到本地端 延續前面的情境,在家裡接續開發後,也提交了幾個版本紀錄,之後也推送到 GitHub 上了。隔天到學校,要怎麼將在家裡做的變更更新到學校的電腦裡? 前面已經完成本地端與遠端儲存庫的對應了,此時只需要在專案資料夾透過下面的指令,即可拉下(Pull)遠端儲存庫後續的版本紀錄: ``` bash git pull ``` 若使用 Visual Studio Code 的話,則可在原始碼控制的面板上,點按面板右上方的 <kbd>...</kbd> 按鈕來展開功能選單,再選擇「**Pull**」將遠端版本紀錄「拉下來」: <kbd>![](https://i.imgur.com/p4TfIys.png)</kbd>