什麼是Git

記錄並管理檔案變更歷史的分散式版本控制系統。在工作目錄中編輯的變更以 git add 登錄到暫存區,以 git commit 記錄到本地儲存庫,再以 git push 送到 GitHub 等遠端儲存庫。可以建立分支平行開發,並以 git merge 合併。除了原始碼,也用於管理 RTL、驗證用的測試平台、腳本等。

日文名稱: Git

「Git」出現在3領域的6道練習題中(Linux與命令列基礎, 軟體開發與專案管理, 雲端與容器基礎等)。

這個名詞所屬的領域: Linux與命令列基礎

三個位置

Git 區分編輯檔案的工作目錄、放置下一次提交所要包含的變更的暫存區(索引),以及保存提交歷史的儲存庫(.git 目錄)。git status 會顯示這三者之間的差異,git diff 顯示工作目錄與暫存區的差異,git diff --staged 則顯示暫存區與最新提交的差異。

分支與遠端

分支是為提交歷史的分岔所取的名稱,讓新功能或修正能在不影響主分支的情況下進行。以 git clone 把遠端儲存庫複製到本地,以 git pull 取回遠端的新提交,以 git push 送出自己的提交。合併在同一處分別做了變更的分支時,會產生衝突,需要由人來解決。

不納入管理的檔案

建置或模擬產生的檔案、日誌、大型波形資料等,要寫進 .gitignore 排除在追蹤對象之外。曾經提交過的檔案,即使寫進 .gitignore 也會繼續被追蹤,因此要用 git rm --cached 移除。若不小心提交了密碼或金鑰,就會一直留在歷史中,所以在提交前用 git status 或 git diff 確認內容的習慣很重要。

練習Git的題目

編輯以 Git 管理的檔案 main.c 後,只執行了「git commit -m "fix"」,結果顯示「no changes added to commit」而沒有提交。理由是下列何者?

  1. A提交之前必須先用 git push 把變更送到共用的儲存庫
  2. B要包含在提交中的變更,必須先用 git add 登錄到暫存區
  3. CGit 在儲存檔案時會自動提交,所以不需要執行 git commit
查看答案與解析

正確答案:B. 要包含在提交中的變更,必須先用 git add 登錄到暫存區

在 Git 中,於工作目錄編輯的變更,只有用 git add 登錄到暫存區(索引)的部分,才會在下一次 git commit 時被記錄。藉由這種兩階段的機制,可以從編輯過的多項變更中只挑出相關的部分,整合成一個提交。使用 git status 可以確認哪些變更已經暫存。也有 git commit -a 的寫法,可把已追蹤檔案的變更一併登錄並提交。

在 Git 中執行了 git commit,但團隊共用的 GitHub 儲存庫中還看不到該提交。理由是下列何者?

  1. Agit commit 只是把變更登錄到暫存區,要記錄必須執行 git add
  2. B要把已提交的變更送到共用的儲存庫,必須執行 git pull
  3. Cgit commit 只記錄在本地儲存庫,要送到遠端必須執行 git push
查看答案與解析

正確答案:C. git commit 只記錄在本地儲存庫,要送到遠端必須執行 git push

Git 是分散式版本控制系統,每位開發者手邊都有整個儲存庫,git commit 會把變更記錄到本地的儲存庫。要送到 GitHub 等遠端儲存庫,需執行 git push;反過來,要把遠端的新提交取回本地,則使用 git pull(或 git fetch 與 git merge)。因此即使沒有連上網路也能提交,之後再一起 push。若其他人已先 push,可能會被要求先取回對方的變更。

常見問題

Git 與 GitHub 有什麼不同?

Git 是在自己電腦上運作的版本控制軟體本身。GitHub 是代管 Git 儲存庫的網路服務,另外加上以拉取請求進行審查、議題管理等功能。也有 GitLab 這類類似的服務或架設在公司內部的伺服器,Git 本身可以與任何服務搭配使用。

要如何取消上一個提交?

若還沒有 push,可以用 git commit --amend 修正上一個提交,或用 git reset 取消。已經 push 並共享的提交,為了不與其他人的歷史產生分歧,使用把取消的變更作為新提交加入的 git revert 比較安全。

解析中的「Git」

出現「Git」的題目(6題)

  1. 編輯以 Git 管理的檔案 main.c 後,只執行了「git commit -m "fix"」,結果顯示「no changes added to commit」而沒有提交。理由是下列何者?
  2. 在 Git 中執行了 git commit,但團隊共用的 GitHub 儲存庫中還看不到該提交。理由是下列何者?
  3. 在以 Git 管理的專案的 .gitignore 中寫了「build/」,但以前提交過的 build/out.log 的變更,仍持續出現在 git status 中。理由是下列何者?
  4. 在 Git 中,兩位開發人員在不同分支各自修改了同一檔案的同一行,然後將一個分支合併到另一個分支。此時會發生的情況,下列何者適當?
  5. 在已知可正常運作的韌體版本之後有1,000個提交,最新的提交會發生缺陷。假設缺陷是由某1個提交引入,其後的提交全都會發生。像 git bisect 那樣以二分搜尋找出原因提交時,需要建置並測試的次數最多為下列何者?
  6. 以宣告式的 IaC(基礎設施即程式碼)工具,套用定義了網路與2台虛擬機器組成的檔案,建立了環境。緊接著在不做任何變更的情況下再次套用同一個檔案,此時發生的事,下列何者適當?

相關名詞

二分搜尋 基礎設施即程式碼(IaC) 正規表示式 訊號(Unix) 符號連結 硬連結 超級使用者 管線(|) 輸入輸出重新導向 檔案權限

前往名詞解釋列表