Git: 基本觀念

主要記錄最初入門 Git 的一些林林總總,一開始不會談太多細節,後續會持續更新,若有發現錯誤也歡迎指正。

簡介

  • Git 是一種追蹤和記錄版本差異的檔案版本控制工具。
  • Git 和常聽到的 GitHub 不一樣,Git 是一種可在自己電腦 離線獨立 管理檔案版本的工具;GitHub 是一款遠端版、需要網路連線、可多人編輯的類Git雲端服務,其他常見類似的服務還有 GitLabBitbucket
  • 簡單來說,Git 和 GitHub、GitLab、Bitbucket 的關係就像是:自己的電腦 和 Google Drive、OneDrive、Dropbox。

使用Git的第一步

安裝後,開始使用 Git 的第一步有兩個方法:一種是自行在自己電腦一步一腳印設置資料夾的Git追蹤環境(自行設置),另一種是直接複製遠端服務的Repository(遠端複製)。

  1. 自行設置:對要追蹤檔案們所在目錄使用 git init
    • 也就是針對要追蹤的檔案們所在目錄建立一個 .git資料夾
    • .git資料夾平常是隱藏在目錄裡,負責儲存追蹤的所有紀錄。
  2. 遠端複製:以下用我GitHub已存在的Repository為例,
    • 如圖點選Code按鈕,出現Clone視窗,按下網址旁邊的按鈕複製網址
    • 註:如果是要先建置一個全新的Repository,也是在建置後找到網址,同樣步驟複製即可
    • 要注意的是,整個遠端Repository複製下來會是一個資料夾(如下圖),通常會在自己電腦要儲存這個Repository資料夾的父層(前一層)資料夾/位置去輸入Git複製指令。
    • 指令:git clone RemoteRepository那串網址

遠端複製的動作會連同 遠端上傳的路徑設定 都幫忙設定好,非常方便,如果常用遠端服務,個人是蠻推薦這個作法。


Git 工作環境

真正要使用 Git 來追蹤檔案異動,要先認識使用 Git 時的工作環境(如下圖),基本上可依 檔案的狀態(state) 分為三區: (1) Working Directory, (2) Staging Area / Index, (3) Local Repository (Git Directory)

  • Working Directory 工作目錄:就是平常自己電腦裡修改、存放檔案的地方。
  • Staging Area 暫存區 / Index 索引:存放那些準備被提交檔案的地方。
  • Git Directory (Local Repository) 本地端儲存庫:確認記錄此次檔案異動的地方,確認記錄的動作稱之為提交(Commit)。這裡稱 Local Repository 是要跟前面說的遠端儲存庫-Remote Repository 區隔。

歸納一下,一般使用 Git 記錄檔案異動的流程如下:

Working Area ⇨ Staging Area ⇨ local Repository ⇨ Remote Repository (optional)

將修正後的檔案從 Working Area上傳至Staging Area,確認檔案異動後再由Local Repository 記錄這次的所有檔案異動。最後的 Remote Repository 看個人是否要上傳,但就像很多人會把檔案備份或分享到雲端硬碟一樣,大家也常將異動紀錄上傳至 Remote Repository。


Git檔案管理

這邊開始要從檔案在 Git 工作環境所存放的位置,了解整個檔案版本異動的管理流程。首先,檔案的狀態對應到檔案存放於哪一區,分別有三種:(1) Modified, (2) Staged, (3) Commited

  • Modified:是指 Git 發現檔案在你的電腦裡被修改了,但還沒被上傳至 Staging Area,此時檔案也是 Unstaged 的狀態。
  • Staged:修改後的檔案上傳至 Staging Area,準備被提交此次異動。
  • Commited:Staging Area 這次的所有檔案異動都被記錄、儲存了。

最後,有關Git的一些基本和常用指令整理在另一篇筆記 ─ [Note] Git: 常用指令




題外話,一個有趣的問題是:為什麼要分3步,而不是從Working Area直接送到Local Repository提交?

在不討論 Git 恢復機制的前提下,個人認為,Local Repository 所儲存的異動基理當是 確認無誤 的狀態,不過有時正式提交後可能會有反悔、想取消上傳或發現有些檔案沒跟著上傳等等。

通常一個系統是由許多人共同開發,想像一下,如果是2步直接上傳的機制,相對較容易出現這種提交出去、拿回來的情形,而這種狀況如果太常發生在開發過程會造成很多困擾,總之我想這是 Git 為了避免這種狀況發生所做的貼心設計(?)