Git - Arch Linux 中文维基

跳至內容

# Git

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Git，最近一次同步於 2025-07-29，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Bisecting bugs with Git
- Concurrent Versions System
- Git 伺服器
- Gitweb
- HTTP tunneling#Tunneling Git
- Subversion
- VCS 軟體打包準則

  "我遇到過一些人，他們認為 Git 是 GitHub 的前端。他們錯了，Git 其實是 AUR 的前端。"—— Linus Torvalds

Git 是由 Linux 內核作者 Linus Torvalds 設計並開發的版本控制系統（VCS），現在被用來維護 AUR 軟體包以及數以千計的其他項目，其中包括 Linux 內核。

## 安裝

安裝 git包 軟體包。要使用開發版本，請安裝 git-gitAUR 軟體包。當使用 git svn、git gui 和 gitk 等工具時請檢查可選依賴項是否安裝。

### 圖形化前端

參考 git GUI Clients。

- Commit — 幫助編寫更好的 Git 和 Mercurial 提交消息的編輯器。

  https://apps.gnome.org/Commit/ || commit包

- Forge Sparks — 支持 Github、GitLab、Gitea 和 Forgejo 的簡單通知應用。

  https://apps.gnome.org/ForgeSparks/ || forge-sparks包

- Giggle — 用於 git 的 GTK+ 前端。

  https://wiki.gnome.org/Apps/giggle/ || giggle包

- GitAhead — 一個包含內置合併工具的 git 前端。

  https://gitahead.github.io/gitahead.com/ || gitaheadAUR

- GitButler — 基於 Git 的版本控制客戶端，使用 Tauri/Rust/Svelte 構建。

  https://gitbutler.com/ || gitbutlerAUR

- Git Cola — 用 Python 編寫的絲滑而強大的 git 圖形前端。

  https://git-cola.github.io/ || git-colaAUR

- Git Extensions — 允許用戶不使用命令行就可以完成 git 各項操作的圖形前端。

  https://gitextensions.github.io/ || gitextensionsAUR

- gitg — 用於查看 git 倉庫的 GNOME GUI 客戶端。

  https://wiki.gnome.org/Apps/Gitg || gitg包

- git-gui — Tcl/Tk 庫編寫的可移植 git 圖形前端。

  https://git-scm.com/docs/git-gui || git包 + tk包
  注意：要打開 git-gui 的拼寫檢查功能，請安裝 aspell包，同時還需要與 `LC_MESSAGES` 環境變量 相對應的字典文件。參閱 FS#28181 和 aspell。

- GitHub Desktop — 由 GitHub 開發的一個基於 Electron 的 GitHub 客戶端。

  https://github.com/desktop/desktop || github-desktopAUR github-desktop-binAUR

- gitk — Tcl/Tk 庫編寫的 Git 倉庫查看器。

  https://git-scm.com/docs/gitk || git包 + tk包

- Gittyup — 基於 Qt 的 Git 客戶端。

  https://github.com/Murmele/Gttyup || gittyupAUR

- Guitar — 一個 Git 的圖形化前端。

  https://github.com/soramimi/Guitar || guitarAUR

- gitui — 用 Rust 編寫的快速的 Git 終端用戶界面。

  https://github.com/extrawurst/gitui || gitui包

- Kommit — KDE 的 Git GUI 客戶端。

  https://apps.kde.org/kommit/ || kommit包

- lazygit — 一個簡潔的 Git TUI 工具。

  https://github.com/jesseduffield/lazygit || lazygit包

- QGit — 可圖形化地按照不同開發分支顯示修訂歷史記錄、查閱補丁內容、查看被修改文件的 Git GUI 查看器。

  https://github.com/tibirna/qgit || qgit包

- RabbitVCS — 一組圖形化工具，用於輕鬆、直接地訪問您使用的版本控制系統。

  http://rabbitvcs.org/ || rabbitvcsAUR

- Sublime Merge — 由 Sublime Text 開發商開發的 Git 前端。

  https://www.sublimemerge.com/ || sublime-mergeAUR

- Tig — 基於 ncurses 的 git 字符模式前端。

  https://jonas.github.io/tig/ || tig包

- ungit — 在不犧牲 git 各種功能的情況下使其變得更加友好。

  https://github.com/FredrikNoren/ungit || nodejs-ungitAUR

## 配置

你至少需要設置好姓名和郵箱之後才能開始使用 Git：

    $ git config --global user.name  "John Doe"
    $ git config --global user.email "johndoe@example.com"

參閱起步 - 初次運行 Git 前的配置。

更多設置選項可參閱#提示與技巧。

## 基本用法

一個 Git 版本庫包含在一個名為 `.git` 的目錄內，該目錄包含了修訂歷史以及其他元數據。版本庫所跟蹤的目錄（默認為父目錄）稱為工作目錄。在工作樹進行的更改在被提交 (commit) 前需要先暫存 (stage) 起來。Git 還可以讓你恢復以前提交的工作樹文件。

參見起步。

### 獲取 Git 倉庫

參見獲取 Git 倉庫 - Git 基礎

### 記錄更改

參見記錄每次更新到倉庫 - Git 基礎

### 查看提交記錄

參見查看提交歷史 - Git 基礎

### 撤銷修改

參見撤消操作 - Git 基礎

### 遠程操作

參見遠程倉庫的使用 - Git 基礎

### 分支 (branch)

參見分支簡介 - Git 分支

#### 分支與合併基礎

參見分支的新建與合併 - Git 分支

#### 分支管理

參見分支管理 - Git 分支

#### 分支開發工作流

參見分支開發工作流 - Git 分支

#### 遠程分支

參見遠程分支 - Git 分支

#### 變基

參見變基 - Git 分支

### 多人合作

#### 分布式工作流

參見分布式工作流程 - 分布式 Git

#### 為已有項目貢獻

參見向一個項目貢獻 - 分布式 Git

#### 維護自己的項目

參見維護項目 - 分布式 Git

### Git 工具

#### 選擇修訂版本

參見選擇修訂版本 - Git 工具

#### 交互式暫存

參見交互式暫存 - Git 工具

#### 貯藏與清理

參見貯藏與清理 - Git 工具

#### 簽署工作

參見簽署工作 - Git 工具

#### 搜索

參見搜索 - Git 工具

#### 重寫歷史

參見重寫歷史 - Git 工具

#### 重置揭密

參見重置揭密 - Git 工具

#### 高級合併

參見高級合併 - Git 工具

#### Rerere

參見Rerere - Git 工具

#### 使用 Git 調試

參見使用 Git 調試 - Git 工具

#### 子模塊

參見子模塊 - Git 工具

#### 打包

參見打包 - Git 工具

#### 替換

參見替換 - Git 工具

#### 憑證存儲

參見憑證存儲 - Git 工具

## 提示與技巧

### 使用 git-config

Git 從 4 個 ini 類型的配置文件裡讀取配置：

- `/etc/gitconfig` 是應用於整個系統的默認配置文件
- `~/.gitconfig` 和 `~/.config/git/config` （自 1.7.12 起）是應用於特定用戶的配置文件
- `.git/config` 是應用於特定倉庫的配置文件

這些文件可以直接編輯，但是更常用的方法是使用 git config，下面是一些示範。

列出當前已配置的變量：

    $ git config list {--local,--global,--system}

將默認文本編輯器從 vim 改成 nano：

    $ git config --global core.editor "nano -w"

設置默認的推送 (push) 行為：

    $ git config --global push.default simple

設置不同的 git difftool 工具（默認是 meld）：

    $ git config --global diff.tool vimdiff

更多信息請參閱 git-config(1) 和配置 Git。

#### 包含單獨的配置文件

自 2012 年的 v1.7.10 版本起，Git 能夠使用 `include` 關鍵字在 `gitconfig` 文件中構建分割成多個配置文件的配置。

提示：當使用 `--local` 或 `--global` 標誌時，默認禁用加載包含的配置文件。要啟用它，請將 `--includes` 標誌與 `git config get` 和 `git config list` 命令一起使用。

### 保持良好的禮儀

- 當你想為一個現有的項目貢獻時，請先閱讀並理解這個項目的許可，因為它可能會過度限制你更改代碼的權力。有些許可會在代碼的所有權方面引起爭議。
- 理解這個項目的社區，以及你可以融入其中的程度。要了解項目的主要方向，可以閱讀所有文檔甚至是代碼庫的 log。
- 當發起一個合併請求，或者提交一個補丁時，保證它是小改動並且有完善的文檔；這將有助於項目維護者理解你的改動，並決定是否合併這些改動或是讓你再改一下。
- 如果貢獻被拒絕，不要氣餒，畢竟這是他們的項目。如果它很重要，請儘可能清楚和耐心地討論這次貢獻的理由，最終可能通過這種方法解決問題。

### 加快身份驗證

每次向 Git 伺服器推送時都要認證身份，你可能會想要避免這種麻煩。

- 如果你是用 SSH 密鑰來認證的，請使用 SSH agents。參閱 OpenSSH#Speeding up SSH 和 OpenSSH#保活。
- 如果你是用帳號和密碼來認證的，在伺服器支持 SSH 的情況下請切換至 SSH 密鑰，否則請嘗試 git-credential-cache 或 git-credential-store。

### 使用 git-credential-libsecret 作為憑證幫助程序

Git 可能會從 org.freedesktop.secrets 兼容密鑰環（如 GNOME Keyring、KeePassXC（英語：KeePass#Secret Service） 或 KDE Wallet）獲取您的憑據。因此，設置一個兼容的密鑰環，並使用以下命令檢查密鑰環是否已註冊到 dbus：

    $ dbus-send --session --print-reply --dest=org.freedesktop.DBus / \
        org.freedesktop.DBus.GetConnectionUnixProcessID \
        string:org.freedesktop.secrets

然後運行

    $ git config --global credential.helper /usr/lib/git-core/git-credential-libsecret

設置 git。

### 使用 git-credential-netrc 作為憑證幫助程序

Git 可以讀取 netrc 文件來訪問憑據。首先，將 Git 指向 netrc 幫助程序腳本：

    $ git config --global credential.helper /usr/share/git/credential/netrc/git-credential-netrc.perl

然後，創建 `.netrc` 文件：

    ~/.netrc

    machine git-host
    login username
    password password

如果您想保護您的機密安全，憑證幫助程序還支持 gpg 加密文件 (`~/.netrc.gpg`)。

### 默認通訊協議

如果你正在使用一個上述那種復用的 SSH 連接，讓 Git 使用 SSH 可能比使用 HTTPS 更快。同時，一些伺服器（比如 AUR）只允許通過 SSH 推送更改。例如，像下面這樣配置可以使得 Git 通過 SSH 訪問 AUR 上的任何倉庫。

    ~/.gitconfig

    [url "ssh://aur@aur.archlinux.org/"]
    	insteadOf = https://aur.archlinux.org/
    	insteadOf = http://aur.archlinux.org/
    	insteadOf = git://aur.archlinux.org/

### Bash 自動補全

要啟用 Bash 的自動補全，請在 Bash 啟動文件裡用 source 加載 `/usr/share/git/completion/git-completion.bash` 文件。或者也可以安裝 bash-completion包。

### Git 提示符

Git 包帶有一個提示符腳本。要啟用它，請用 source 加載 `/usr/share/git/completion/git-prompt.sh` 腳本，然後使用 `%s` 參數設置一個自定義 shell 提示符：

- Bash 用戶： `PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '`
- Zsh 用戶： `setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '`
  提示：Zsh 提供了 `vcs_info` 函數作為替代方案。參見 zshcontrib(1) § GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS。

注意命令替換必須被轉義，詳情見 Bash/Prompt customization#Embedding commands。持久化配置見命令行解釋器#配置文件。

當切換至一個 Git 倉庫所在目錄時，shell 提示符會變成所在分支名稱。也可以配置提示符來顯示其他信息：

Shell 變量 | 信息
--- | ---
GIT_PS1_SHOWDIRTYSTATE | 已暫存 (staged) 顯示 `+`，未暫存 (unstaged) 顯示 `*`。
GIT_PS1_SHOWSTASHSTATE | 已儲藏 (stashed) 顯示 `$`。
GIT_PS1_SHOWUNTRACKEDFILES | 有未跟蹤文件時顯示 `%`。
GIT_PS1_SHOWUPSTREAM | `<`, `>`, `<>` 分別表示落後、領先或偏離上游。
GIT_PS1_STATESEPARATOR | 分支名稱和狀態符號之間的分隔符
GIT_PS1_DESCRIBE_STYLE | 分離 HEAD 時，相對於標籤/分支顯示提交
GIT_PS1_SHOWCOLORHINTS | 顯示顏色

環境變量的完整文檔可在腳本的注釋中找到。

注意：

- 如果發生了 `$(__git_ps1)` 返回 `((unknown))` 的情況，是因為有一個 `.git` 文件夾在你當前的文件夾裡面，但卻不包含任何存儲庫，因此 Git 不認識它。例如，將 Git 在`~/.gitconfig` 的配置文件誤認為在 `~/.git/config` 就會發生這種情況。
- 如果提示符在遇到非常大的存儲庫時延遲，很可能是由於 `GIT_PS1_SHOWUNTRACKEDFILES` 選項，該選項每次都會觸發完整的目錄樹掃描以檢測新文件，從而導致明顯的性能影響。要為這些存儲庫本地禁用此選項，您可以使用命令 `git config --local bash.showUntrackedFiles false`。

你也可以使用來自 AUR 的自定義 git shell 提示符軟體包，例如 bash-git-promptAUR 或 gittifyAUR。

### 可視化顯示

要了解已經完成了多少工作：

    $ git diff --stat

帶有 fork 顯示的 git log：

    $ git log --graph --oneline --decorate

給圖形化的 git log 做一個別名（使用 git graph 即可顯示經過修飾的 log）：

    $ git config --global alias.graph 'log --graph --oneline --decorate'

### 關於提交 (commit) 的小提示

重置為以前的提交（非常危險，這會擦除所有跟蹤文件到指定提交）：

    $ git reset --hard HEAD~

如果遠程倉庫的地址發生變化，可以這樣更新它的位置：

    $ git remote set-url origin git@address:user/repo.git

自動附加簽名行到提交（將某個 姓名-電郵 簽名添加到提交中，某些項目會要求這樣做）：

    $ git commit -s

自動附加簽名到補丁（使用 `git format-patch commit` 時生效）：

    $ git config --local format.signoff true

提交已更改文件的特定部分。如果有大量更改時，最好拆分成多個提交，這種情況下這個命令通常很有用：

    $ git add -p

### 對提交 (commit) 簽名

Git 允許使用 GnuPG 對提交和標籤進行簽名，請參見簽署工作。

注意： 如果是藉助 pinentry包 來進行 GPG 簽名，請確保 `export GPG_TTY=$(tty)`（或者使用 pinentry-tty），否則當 GPG 處於鎖定狀態時簽名這一步會失敗（因為它無法在 shell 提示符裡詢問 pin 碼）。

配置 Git 使它自動對提交進行簽名：

    $ git config --global commit.gpgSign true

### 在非主分支上工作

偶爾項目維護人員會要求你在其他分支上完成工作。這些分支通常被稱為 `devel` 或 `testing`。首先要克隆存儲庫。

要進入不是主分支的分支（git clone 只會顯示主分支，但其他分支其實也是存在的，用 `git branch -a` 可以顯示出來）：

    $ git checkout -b branch origin/branch

然後就可以像平常一樣編輯文件，但是要使得整個倉庫都保持同步，下面這兩個命令都要用：

    $ git pull --all
    $ git push --all

### 直接將補丁發送至郵件列表

如果你想直接將補丁發送至一個郵件列表，需要安裝以下軟體包：perl-authen-sasl包 和 perl-io-socket-ssl包。

確保你已經配置了用戶名和郵件地址（參見#配置）。

配置你的郵箱設置：

    $ git config --global sendemail.smtpserver smtp.example.com
    $ git config --global sendemail.smtpserverport 587
    $ git config --global sendemail.smtpencryption ssl
    $ git config --global sendemail.smtpuser foobar@example.com

現在你應該可以將補丁發送至某個郵件列表了（可參閱OpenEmbedded: 通過電子郵件發送補丁和 git-send-email.io）：

    $ git add filename
    $ git commit -s
    $ git send-email --to=openembedded-core@lists.openembedded.org --confirm=always -M -1

### 遠程庫很大時的注意事項

使用大型遠程存儲庫時，必須獲取大量數據。以下示例使用 Linux 內核來說明如何使用此類代碼庫。

#### 接收整個倉庫

最簡單的解決方案是獲取整個存儲庫：

    $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

注意：`git clone` 不支持斷點續傳。

可以通過 `git pull` 更新存儲庫。

#### 部分接收

為了將本地存儲庫限制為原存儲庫的較小子集，例如在 v4.14 之後分離出錯誤，請使用淺克隆 (shallow clone)：

    $ git clone --shallow-exclude v4.13 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

將獲取 v4.14 及更高版本，但不會獲取 v4.13 及更早版本。

如果您只想要最新的快照，則可以忽略所有歷史記錄。（如果有可用且足夠完整的 tarball，請選擇它。從 git 存儲庫下載需要更大的帶寬。）您可以使用以下命令獲取它：

    $ git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

可以在之後獲取較舊的提交，如以下兩個示例：

    $ git fetch --tags --shallow-exclude v4.1
    $ git fetch --tags --shallow-since 2016-01-01

注意：如果不指定 `--tags`，就不會獲取標籤。

#### 使用 Scalar

Scalar，前身是 Virtual File System for Git (VFS for Git)，允許無需本地實例訪問 git 倉庫。

參見 scalar(1)。

#### 獲取其他分支

在上面的示例中，本地的倉庫僅跟蹤主線內核，即"最新開發"的內核。假設你想獲取最近的 LTS 內核，比如最新的 4.14 分支，可以這麼做：

    $ git remote set-branches --add origin linux-4.14.y
    $ git fetch --shallow-exclude v4.14
    $ git branch --track linux-4.14.y origin/linux-4.14.y

最後一行不是必須的，但你應該需要執行它。 （要獲取需要的那個分支的具體名稱，沒有什麼通用的方法，或許可以靠 Gitweb 頁面的"ref"連結來猜測）

如果需要 linux-4.14.y 的快照，這樣做：

    $ git checkout linux-4.14.y

或者將它解壓到其他目錄裡：

    $ mkdir /path/to/src-4.14; cd /path/to/src-4.14
    $ git clone --no-local --depth 1 -b linux-4.14.y ../linux-stable

然後像平常一樣，執行 `git pull` 來更新你的快照。

### 過濾機密信息

有時，軟體可能會將純文本密碼保存在配置文件中，而不是掛接到密鑰環中。在這些情況下，git clean-filters 可能很方便，可以避免意外提交機密信息。例如，以下文件將過濾器分配給文件"some-dotfile"：

    .gitattributes

    some-dotfile filter=remove-pass

每當文件"some-dotfile"添加到 git 時，git 都會在添加之前對文件調用過濾器"remove-pass"。必須在 git 配置文件中定義過濾器，例如：

    .git/config

    [filter "remove-pass"]
    clean = "sed -e 's/^password=.*/#password=TODO/'"

注意：在這種情況下，轉義 sed 表達式的特殊字符可能是一項棘手的任務。請記住，git 會將兩個反斜槓變成一個，而 git 調用來運行命令的 shell 會再次將兩個反斜槓變成一個。有關更多詳細信息，請參閱Git 過濾器和 sed 爭奪 `\$`（英文）。

### HTML 幫助文件

通過安裝 git-htmldocsAUR，可以以 HTML 形式獲取 `git help` 文檔。安裝後，可以通過傳遞 `-w` 標誌來訪問 HTML 文檔。例如：

    $ git help -w merge

可以通過設置 `git config` 選項默認加載 HTML 文檔：

    $ git config --global help.format html

## 擴展

### 助手和工具

- git-extras — Git 實用工具集合（倉庫摘要、repl、變更日誌、作者提交百分比等）

  https://github.com/tj/git-extras || git-extrasAUR - 如果使用 oh-my-zsh，還可以啟用 git-extras 插件

- gitflow-cjs — 使用 Vincent Driessen 的分支模型擴展 Git。CJS 版本是一個積極維護的分支。

  https://github.com/CJ-Systems/gitflow-cjs || gitflow-cjsAUR

- gitmoji-cli — 一個 gitmoji 交互式 NodeJS 客戶端，用於在提交消息中使用 gitmojis。

  https://github.com/carloscuesta/gitmoji-cli || nodejs-gitmoji-cliAUR

### 大文件同步支持

- git-annex — 用 Haskell 編寫的分布式文件同步系統，允許使用 Git 管理大數據。

  https://git-annex.branchable.com || git-annex包

### 多 Git 倉庫管理

- git-bulk — 用 Bash 編寫的命令行工具，用於管理多個 Git 倉庫。

  https://github.com/tj/git-extras || git-extrasAUR

- mani — 用 Go 編寫的命令行工具和 TUI，用於管理多個 Git 倉庫。

  https://github.com/alajmo/mani || maniAUR

- gita — 用 Python 編寫的命令行工具，用於管理多個 Git 倉庫。

  https://github.com/nosarthur/gita || gitaAUR

- mu-repo — 用 Python 編寫的命令行工具，用於管理多個 Git 倉庫。

  https://github.com/fabioz/mu-repo || mu-repoAUR

- myrepos (mr) — 用 Perl 編寫的命令行工具，用於管理多個 Git 倉庫。

  https://myrepos.branchable.com/ || myrepos包

## 參見

- Git 手冊頁，見 git(1)
- Pro Git book
- GitHub 的 Git Reference
- Git workflow: Forks, remotes, and pull requests
- VideoLAN wiki article
- Git Protocols - Git on the Server
- [https://gun.io/blog/how-to-github-fork-b

分類：​

- 版本控制系統

Git
新增話題