出自 Arch Linux 中文维基
"I've met people who thought git is a front-end to GitHub. They were wrong, git is a front-end to the AUR." — Linus T.

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

安裝

安裝 git 軟體包。要使用開發版本,請安裝 git-gitAUR 軟體包。當使用 git svngit guigitk 等工具時請檢查可選依賴項是否安裝。

圖形化前端

參考 git GUI Clients

  • Bonsai — Git 版本控制管理器。maui包組
https://mauikit.org/apps/ || bonsai 的一部分
  • Giggle — 用於 git 的 GTK+ 前端。
https://wiki.gnome.org/Apps/giggle/ || giggle
  • GitAhead — 一個包含內置合併工具的 git 前端。
https://gitahead.github.io/gitahead.com/ || gitaheadAUR
  • 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#28181aspell
  • 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 基礎

分支 (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 {--local,--global,--system} --list

將默認文本編輯器從 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

保持良好的禮儀

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

加快身份驗證

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

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

Git 可能會從 org.freedesktop.secrets 兼容密鑰環(如 GNOME KeyringKeePassXC英語KeePass#Secret ServiceKDE 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)")]\$ '

要自動完成這項工作,請參閱命令行解釋器#配置文件

當切換至一個 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-promptAURgittifyAUR

可視化顯示

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

$ 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

在非主分支上工作

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

要進入不是主分支的分支(git clone 只會顯示主分支,但其他分支其實也是存在的,用 git branch -a 可以顯示出來):

$ git checkout -b branch origin/branch

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

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

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

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

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

配置你的郵箱設置:

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

現在你應該可以將補丁發送至某個郵件列表了(可參閱OpenEmbedded:How to submit a patch to OpenEmbedded#Sending patches):

$ 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,就不會獲取標籤。

獲取其他分支

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

$ git remote set-branches --add origin linux-4.17.y
$ git fetch
$ git branch --track linux-4.17.y origin/linux-4.17.y

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

如果需要 linux-4.17.y 的快照,這樣做:

$ git checkout -b linux-4.17.y

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

$ mkdir /foo/bar/src-4.17; cd /foo/bar/src-4.17
$ git clone --no-local --depth 1 -b linux-4.17.y  ../linux-stable

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

未來可能出現的其他方案

Git 虛擬文件系統 (Git Virtual Filesystem, GVFS) 由微軟開發,允許在不克隆倉庫至本地的情況下使用 git 倉庫。(參閱 Microsoft 的這篇博客Wikipedia 文章。)

它已經有了一個後繼版本:Scalar,可在 git-vfsAUR[損壞的連結:找不到軟體包] 中找到,這是 Microsoft 的 git 分支,包括 gvfs 和 scalar。

過濾機密信息

有時,軟體可能會將純文本密碼保存在配置文件中,而不是掛接到密鑰環中。在這些情況下,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

擴展

https://github.com/petervanderdoes/gitflow || gitflow-avhAUR
  • git-extras — 一些 git 實用程序[存儲庫概覽、交互式命令行環境 (repl)、變更日誌填充、作者提交百分比等]
https://github.com/tj/git-extras || git-extrasAUR⸺如果使用 oh-my-zsh,還可以啟用 git-extras 插件
  • gitmoji-cli — 一個 gitmoji 交互式 NodeJS 客戶端,用於在提交消息中使用 gitmojis。
https://github.com/carloscuesta/gitmoji-cli || nodejs-gitmoji-cliAUR

參見