Git 版本控制系統的核心功能在於其豐富的指令集,讓開發者能有效追蹤程式碼的變化並進行協作。從基本的初始化、複製儲存函式庫,到新增、提交、檢視變更紀錄,這些指令構成了日常開發流程的基本。更進一步,分支管理指令允許開發者在不同功能或版本上平行工作,再透過合併指令整合變更。與遠端儲存函式庫互動的指令,例如新增遠端、下載更新、上傳程式碼等,則實作了團隊協作和程式碼分享。此外,Git 也提供錯誤修復指令,例如還原到先前狀態、復原提交等,以應對開發過程中可能發生的錯誤。除了這些核心指令,Git 還提供許多進階功能,例如搜尋特設定檔案、管理工作樹狀、操作庫存、使用標籤標記版本、運用 Hook 自動化任務,以及使用 Gitbox 等圖形化介面工具。

Git 指令大全

Git 是一個版本控制系統,提供了許多指令來管理和操作版本函式庫。以下是 Git 中一些常用的指令:

搜尋檔案

  • --files-with-matches:列出包含匹配結果的檔案
  • --files-without-matches(-L):列出不包含匹配結果的檔案

搜尋選項

  • --full-name:顯示檔案名稱相對於工作樹頂部,而不是相對於當前目錄
  • --break:合併同一檔案中的匹配結果,並在每個結果集之間印出空白行
  • --heading:在每個檔案的匹配結果之前顯示檔案名稱,而不是在每行都顯示
  • --all-match:當使用多個模式時,只顯示包含至少一個每個模式的檔案

匹配選項

  • -i--regexp-ignore-case):忽略大小寫差異
  • -E--extended-regexp):使用擴充套件正規表示式;預設型別是基本正規表示式
  • -F--fixed-strings):將限制模式視為字面字串進行匹配;即不將其解釋為正規表示式
  • --perl-regexp:使用 Perl 風格的正規表示式;這需要 Git 被編譯為 –with-libpcre 選項

Git Rev-Parse

Git Rev-Parse 是一個管道命令,主要用於命令列中指定修訂版本的選項。您可以直接使用它,它也可以用於顯示給定提交名稱拼寫的翻譯。

Git Rev-Parse 還有一些有用的選項,包括:

  • --git-dir:顯示當前儲存函式庫的 Git 目錄
  • --show-toplevel:顯示儲存函式庫的頂級目錄

內容解密:

上述指令和選項可以幫助您更好地管理和操作 Git 儲存函式庫。透過使用這些指令,您可以更有效地搜尋檔案、指定修訂版本和檢視儲存函式庫屬性。

圖表翻譯:

  graph LR
    A[Git 指令] --> B[搜尋檔案]
    B --> C[列出包含匹配結果的檔案]
    B --> D[列出不包含匹配結果的檔案]
    A --> E[指定修訂版本]
    E --> F[使用 Git Rev-Parse]
    F --> G[顯示 Git 目錄]
    F --> H[顯示儲存函式庫頂級目錄]

上述圖表展示了 Git 指令和搜尋檔案之間的關係,以及如何使用 Git Rev-Parse 來指定修訂版本和檢視儲存函式庫屬性。

Git 工作樹狀管理

Git 是一個版本控制系統,讓我們可以管理程式碼的變化。當我們使用 Git 時,工作樹狀(working tree)是指我們目前工作目錄的狀態。下面介紹一些 Git 指令,讓我們可以管理工作樹狀。

檢查工作樹狀

  • git rev-parse --is-inside-git-dir:檢查目前目錄是否在 Git 目錄內。
  • git rev-parse --is-inside-working-tree:檢查目前目錄是否在工作樹狀內。
  • git rev-parse --is-bare-repository:檢查目前儲存函式庫是否為 bare 儲存函式庫。

清除未追蹤檔案

git clean 指令可以用來清除未追蹤檔案。未追蹤檔案是指那些沒有被 Git 追蹤的檔案。這些檔案可能是由編譯器產生的,或是其他工具產生的臨時檔案。

  • git clean -f:強制清除未追蹤檔案。
  • git clean -n:模擬清除未追蹤檔案,不實際清除。
  • git clean -q:只報告錯誤,不顯示清除的檔案。
  • git clean -e <pattern>:加入忽略規則。
  • git clean -d:清除未追蹤目錄。
  • git clean -x:忽略正常的忽略規則。
  • git clean -X:只清除忽略的檔案。

暫存變更

git stash 指令可以用來暫存變更。當我們想要切換分支或提取最新的程式碼,但又不想丟失目前的變更時,可以使用 git stash 暫存變更。

  • git stash save:暫存變更。
  • git stash list:顯示暫存的變更。
  • git stash apply:套用暫存的變更。
  • git stash drop:刪除暫存的變更。

Git 庫存(Stash)管理

Git 庫存(Stash)是一種暫存修改的功能,允許您臨時儲存更改的檔案,而不需要提交它們。這對於切換分支或處理緊急修復時非常有用。

庫存命令

Git 庫存有幾個子命令,包括:

  • save:儲存當前的工作狀態為一個庫存。
  • list:列出所有庫存。
  • show:顯示某個庫存的內容。
  • pop:還原某個庫存並將其從庫存列表中刪除。
  • apply:還原某個庫存,但不將其從庫存列表中刪除。
  • branch:建立一個新分支並還原某個庫存到該分支上。
  • drop:從庫存列表中刪除某個庫存。

儲存庫存

使用 git stash save 命令可以儲存當前的工作狀態為一個庫存。您可以選擇是否儲存未追蹤的檔案以及是否保留索引。

git stash save [--patch] [--keep-index] [--include-untracked] [<message>]
  • --patch:以互動方式選擇要儲存的更改。
  • --keep-index:不還原已經應用到索引的更改。
  • --include-untracked:儲存未追蹤的檔案。
  • <message>:儲存的訊息。

列出庫存

使用 git stash list 命令可以列出所有庫存。

git stash list [<options>]
  • <options>:與 git log 命令相同的選項。

顯示庫存

使用 git stash show 命令可以顯示某個庫存的內容。

git stash show [<stash>]
  • <stash>:要顯示的庫存(預設為最新的庫存)。

還原庫存

使用 git stash pop 命令可以還原某個庫存並將其從庫存列表中刪除。

git stash pop [<stash>] [--index]
  • <stash>:要還原的庫存(預設為最新的庫存)。
  • --index:還原索引。

使用 git stash apply 命令可以還原某個庫存,但不將其從庫存列表中刪除。

git stash apply [<stash>] [--index]
  • <stash>:要還原的庫存(預設為最新的庫存)。
  • --index:還原索引。

切換分支並還原庫存

使用 git stash branch 命令可以建立一個新分支並還原某個庫存到該分支上。

git stash branch <branchname> [<stash>]
  • <branchname>:新分支的名稱。
  • <stash>:要還原的庫存(預設為最新的庫存)。

刪除庫存

使用 git stash drop 命令可以從庫存列表中刪除某個庫存。

git stash drop [<stash>]
  • <stash>:要刪除的庫存(預設為最新的庫存)。

內容解密:

上述命令可以幫助您有效地管理 Git 庫存。例如,當您需要切換分支時,您可以使用 git stash save 命令儲存當前的工作狀態,然後切換到另一個分支。當您需要還原儲存的工作狀態時,您可以使用 git stash popgit stash apply 命令。

圖表翻譯:

以下是 Git 庫存的流程圖:

  flowchart TD
    A[開始] --> B[儲存工作狀態]
    B --> C[切換分支]
    C --> D[還原工作狀態]
    D --> E[刪除庫存]
    E --> F[結束]

這個流程圖展示瞭如何使用 Git 庫存管理工作狀態和切換分支。首先,儲存當前的工作狀態,然後切換到另一個分支。接下來,還原儲存的工作狀態,最後刪除庫存。

Git 的雜項命令

Git 中有一些雜項命令可以幫助我們更好地管理版本函式庫。其中包括 git cleargit showgit tag 等。

git clear

git clear 用於刪除整個 stash 列表。當我們不再需要某些 stash 時,可以使用這個命令來清除它們。

git show

git show 命令用於顯示給定的物件(預設為 HEAD)的內容,根據物件型別以適合的方式顯示。例如:

  • Commit:顯示提交 ID、作者、日期和差異。
  • Tag:顯示標籤訊息和標籤物件。
  • Tree:顯示樹中的路徑名稱(一級)。
  • Blob:顯示內容。

我們可以使用 git show 來檢視提交之間的差異,例如 git show foo~ foo。此外,還可以使用 --format 選項來自定義輸出格式。

git tag

Git 標籤(tag)給提交一個穩定的、人類可讀的名稱,例如「version-1.0」或「release/2022-01-01」。Git 中有兩種型別的標籤:

  • 輕量標籤(Lightweight Tag):只是一個指向提交的參照,存放在 refs/tags 中。
  • 註解標籤(Annotated Tag):也是一個存放在 refs/tags 中的參照,但它指向一個標籤物件,該物件包含了更多資訊,例如標籤作者、時間戳、標籤訊息和可選的 GnuPG 加密簽名。

使用 git tag 命令可以建立新的輕量標籤或註解標籤。例如,git tag tagname commit 建立了一個新的輕量標籤,指向給定的提交(預設為 HEAD)。可用的選項包括:

  • --annotate-a:建立一個註解標籤。
  • --sign-s:建立一個簽名標籤(意味著 -a),使用提交者信箱地址或 user.signingkey 的 GnuPG 金鑰進行簽名。

透過這些命令,我們可以更好地管理 Git 版本函式庫中的提交和標籤,提高版本控制的效率和可讀性。

Git 標籤管理

Git 標籤(tag)是用於標記特定版本的提交(commit)的方法。它可以幫助您跟蹤版本變化,並提供了一種方便的方式來參照特定的提交。

建立標籤

您可以使用 git tag 命令來建立一個新的標籤。例如:

git tag -a v1.0 -m "版本 1.0"

這將建立一個名為 v1.0 的標籤,並附加一條訊息 “版本 1.0”。

簽署標籤

您可以使用 --local-user 選項來簽署標籤。例如:

git tag -a v1.0 -m "版本 1.0" -u key-ID

這將建立一個簽署的標籤,並使用指定的 GnuPG 金鑰。

強制替換現有標籤

如果您想要替換現有的標籤,您可以使用 --force 選項。例如:

git tag -a v1.0 -m "版本 1.0" -f

這將強制替換現有的 v1.0 標籤。

刪除標籤

您可以使用 --delete 選項來刪除一個標籤。例如:

git tag -d v1.0

這將刪除名為 v1.0 的標籤。

驗證簽署

您可以使用 --verify 選項來驗證標籤的簽署。例如:

git tag -v v1.0

這將驗證 v1.0 標籤的簽署。

列出標籤

您可以使用 --list 選項來列出所有標籤。例如:

git tag -l

這將列出所有標籤。

列出包含提交的標籤

您可以使用 --contains 選項來列出包含指定提交的標籤。例如:

git tag --contains commit-ID

這將列出包含指定提交的所有標籤。

列出指向物件的標籤

您可以使用 --points-at 選項來列出指向指定物件的標籤。例如:

git tag --points-at object-ID

這將列出指向指定物件的所有標籤。

從遠端刪除標籤

如果您想要從遠端刪除一個標籤,您需要使用 git push 命令。例如:

git push origin --delete v1.0

這將從遠端刪除名為 v1.0 的標籤。

內容解密:

  • git tag 命令用於建立、列出、刪除和驗證 Git 標籤。
  • -a 選項用於建立一個簽署的標籤。
  • -m 選項用於指定標籤訊息。
  • -u 選項用於指定簽署金鑰。
  • -f 選項用於強制替換現有的標籤。
  • -d 選項用於刪除一個標籤。
  • -v 選項用於驗證標籤的簽署。
  • -l 選項用於列出所有標籤。
  • --contains 選項用於列出包含指定提交的標籤。
  • --points-at 選項用於列出指向指定物件的標籤。

圖表翻譯:

  flowchart TD
    A[Git Tag] --> B[Create Tag]
    B --> C[Sign Tag]
    C --> D[Verify Tag]
    D --> E[List Tags]
    E --> F[Delete Tag]
    F --> G[Push Tag]
    G --> H[Delete Remote Tag]

這個流程圖展示了 Git 標籤的生命週期,從建立標籤到刪除遠端標籤。

Git 指令詳解

Git 是一個版本控制系統,讓我們可以追蹤程式碼的變化。以下是 Git 中一些重要指令的詳解。

刪除遠端標籤

如果你想要刪除遠端的標籤,可以使用以下指令:

git push origin :tagname

這個指令會刪除遠端倉函式庫中的標籤。

下載遠端標籤

當你從遠端倉函式庫下載資料時,Git 會自動下載新的標籤。但是,如果你使用 git pull 指令指定遠端倉函式庫和分支,則不會下載新的標籤。

避免覆寫標籤

Git 不會自動覆寫現有的標籤,因為標籤可能代表重要的資訊,例如官方版本或安全性修復。 如果你不小心推播了一個錯誤的標籤,最佳的做法是使用一個新的標籤名稱。

推播新標籤

如果你建立了新的標籤,可以使用以下指令推播到遠端倉函式庫:

git push --tags

回溯設定標籤日期

你可以使用 GIT_COMMITTER_DATE 環境變數來設定標籤的日期。例如:

GIT_COMMITTER_DATE="2013-02-04 07:37" git tag...

比較差異

git diff 指令可以用來比較工作目錄、索引和提交之間的差異。以下是一些常見的用法:

  • git diff:顯示未暫存的變化。
  • git diff --staged:顯示暫存的變化。
  • git diff <commit>:顯示工作目錄和指定提交之間的差異。
  • git diff <A> <B>:顯示兩個提交、樹或 blob 之間的差異。

你可以使用選項和引數來控制比較的範圍和顯示方式。例如:

git diff --stat

這個指令會顯示差異的摘要。

比較特設定檔案

你可以使用路徑模式來限制比較的範圍。例如:

git diff -- '*.java' '*.[ch]'

這個指令會顯示 Java 和 C原始碼檔案的未暫存變化。

Git 工具與 Hook

Git 是一個強大的版本控制系統,提供了許多工具和功能來幫助開發者管理程式碼。其中,git instaweb 是一個方便的工具,可以啟動一個網頁伺服器來瀏覽 Git 儲存函式庫。

Git Instaweb

git instaweb 是一個 Git 的內建工具,可以啟動一個網頁伺服器來瀏覽 Git 儲存函式庫。這個工具使用 lighttpd 網頁伺服器,並支援其他網頁伺服器如 Apache。使用 git instaweb 可以輕鬆地瀏覽 Git 儲存函式庫,並且可以設定為在本地主機或遠端主機上執行。

Git Hook

Git Hook 是一個允許開發者在特定事件發生時執行自定義動作的機制。Hook 可以用於驗證提交訊息、自動執行測試、或是執行其他自定義動作。Git 提供了許多預先定義的 Hook,例如 commit-msg Hook,可以用於驗證提交訊息。

視覺化工具

Git 還提供了許多視覺化工具來幫助開發者瀏覽複雜的提交圖和合併衝突。其中包括:

  • gitk: 一個使用 Tcl/Tk 的 Git 圖形介面工具。
  • git log --graph: 一個簡單的 Git 提交圖工具。
  • tig: 一個根據終端的 Git 圖形介面工具。
  • QGit: 一個使用 QT4 的 Git 圖形介面工具。
  • GitHub: 一個 GitHub 應用程式,支援 OS X、Windows 和 Eclipse。
  • SmartGit: 一個支援 Linux、OS X 和 Windows 的 Git 圖形介面工具,也支援 Mercurial 版本控制系統。

內容解密:

以上工具和功能可以幫助開發者更有效地管理程式碼和合作。透過使用 git instaweb 和 Git Hook,開發者可以輕鬆地瀏覽和管理 Git 儲存函式庫,並且可以執行自定義動作來驗證提交訊息或自動執行測試。視覺化工具可以幫助開發者瀏覽複雜的提交圖和合併衝突,從而提高開發效率。

圖表翻譯:

  graph LR
    A[Git Instaweb] --> B[啟動網頁伺服器]
    B --> C[瀏覽 Git 儲存函式庫]
    C --> D[設定 Hook]
    D --> E[執行自定義動作]
    E --> F[驗證提交訊息]
    F --> G[自動執行測試]
    G --> H[視覺化提交圖]
    H --> I[瀏覽合併衝突]

以上圖表展示了 Git Instaweb、Hook 和視覺化工具之間的關係。透過使用這些工具和功能,開發者可以更有效地管理程式碼和合作。

Gitbox 和 Submodules

Gitbox 是一款專為 OS X 設計的 Git 客戶端,具有非常漂亮的原生 Mac 視覺效果。

Submodules

在某些情況下,您可能需要在自己的專案中使用另一個專案的原始碼,但您可能不想將兩個專案合併成一個儲存函式庫。這種情況可能會很尷尬。

您可能不想將另一個專案的整個歷史記錄合併到自己的專案中,因為這會使您的歷史記錄變得混亂(雖然「子樹」合併策略可以幫助您解決這個問題)。Git 有一個名為「子模組」(submodules)的功能來解決這個問題:它允許您在自己的儲存函式庫中的子目錄中維護另一個 Git 儲存函式庫作為一個被跟蹤的物件。

在您的儲存函式庫中的提交樹中,子模組參照包括另一個儲存函式庫中的提交 ID,指示另一個儲存函式庫中的特定狀態。這定義了您提交中對應目錄的內容,而不會將所有參照和物件包含在您的儲存函式庫中。

常見問題解答

本章節介紹了一些命令和配方,以實作特定的任務。有些是之前介紹過的,並在此重述或參照以便於查閱,另外有些是新的。

請記住,您通常不想編輯已經發布的提交歷史記錄。示例中參照的遠端儲存函式庫使用最常見的情況,即「origin」。rev 是任何修訂版本名稱,如第 8 章所述。

如何建立和使用中央儲存函式庫?

假設您在伺服器 mars 上有一個名為 ares 的帳戶,並且您有一個名為 foo 的專案(可能是在家、工作或筆記型電腦上的儲存函式庫中)。首先,登入伺服器並建立一個「bare」儲存函式庫(您不會直接使用它):

ares> git init --bare foo
Initialized empty Git repository in /u/ares/foo/.git

然後,如果這是具有現有內容的專案,將該儲存函式庫連線到新的遠端儲存函式庫作為其 origin(假設有一個本地 master 分支):

$ cd foo
$ git push -u origin master

Mermaid 圖表:Git 儲存函式庫結構

  graph TD
    A[Git 儲存函式庫] --> B[子模組]
    B --> C[提交 ID]
    C --> D[遠端儲存函式庫]
    D --> E[origin]

圖表翻譯:

此圖表展示了 Git 儲存函式庫、子模組、提交 ID、遠端儲存函式庫和 origin 之間的關係。Git 儲存函式庫包含子模組,子模組參照提交 ID,提交 ID 指向遠端儲存函式庫,遠端儲存函式庫連線到 origin。這個結構允許您在自己的儲存函式庫中維護另一個 Git 儲存函式庫作為一個被跟蹤的物件。

Git 常用命令大全

Git 是一個版本控制系統,下面是 Git 中一些常用的命令:

基本命令

  • git init:初始化一個 Git 倉函式庫。
  • git clone:複製一個 Git 倉函式庫。
  • git add:新增檔案到 Git 倉函式庫。
  • git commit:提交變更到 Git 倉函式庫。
  • git log:檢視提交記錄。
  • git status:檢視 Git 倉函式庫的狀態。

分支管理

  • git branch:列出所有分支。
  • git branch -a:列出所有分支,包括遠端分支。
  • git checkout:切換到另一個分支。
  • git checkout -b:建立一個新分支並切換到該分支。
  • git merge:合併兩個分支。

遠端操作

  • git remote add:新增一個遠端倉函式庫。
  • git fetch:從遠端倉函式庫下載資料。
  • git push:上傳資料到遠端倉函式庫。
  • git pull:下載資料從遠端倉函式庫並合併到當前分支。

修復錯誤

  • git reset:重置 Git 倉函式庫到之前的狀態。
  • git revert:復原一個提交。
  • git cherry-pick:應用一個提交到當前分支。

從技術架構視角來看,Git 提供了豐富的指令集,涵蓋了版本控制的各個方面,從基本的檔案新增、提交、檢視歷史記錄,到複雜的分支管理、遠端協作、子模組應用等。深入剖析 Git 的內部機制,可以發現其核心價值在於分散式架構和高效的版本管理演算法,這使得團隊協作和程式碼版本追蹤變得更加便捷和可靠。然而,Git 的指令繁多且部分指令用法複雜,對於初學者而言有一定的學習曲線。技術團隊應著重於理解 Git 的核心概念和工作流程,並掌握常用的指令,才能充分發揮 Git 的版本控制能力。對於需要管理大型專案或複雜程式碼函式庫的團隊,建議深入研究 Git 的高階功能,例如子模組、Hook 和各種視覺化工具,以提升團隊協作效率和程式碼管理水平。未來,Git 的發展方向將更注重於使用者經驗的提升和與其他開發工具的整合,以進一步簡化開發流程並降低使用門檻。玄貓認為,熟練掌握 Git 已成為現代軟體開發者的必備技能,持續學習和探索 Git 的新功能將有助於提升開發者的專業素養和競爭力。