- "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 svn、git gui 和 gitk 等工具時請檢查可選依賴項是否安裝。
圖形化前端
參考 git GUI Clients。
- Bonsai — Git 版本控制管理器。maui包組
- https://mauikit.org/apps/ || bonsai包 的一部分
- Giggle — 用於 git 的 GTK+ 前端。
- GitAhead — 一個包含內置合併工具的 git 前端。
- Git Cola — 用 Python 編寫的絲滑而強大的 git 圖形前端。
- Git Extensions — 允許用戶不使用命令行就可以完成 git 各項操作的圖形前端。
- gitg — 用於查看 git 倉庫的 GNOME GUI 客戶端。
- git-gui — Tcl/Tk 庫編寫的可移植 git 圖形前端。
- GitHub Desktop — 由 GitHub 開發的一個基於 Electron 的 GitHub 客戶端。
- gitk — Tcl/Tk 庫編寫的 Git 倉庫查看器。
- https://git-scm.com/docs/gitk || git包 + tk包
- Gittyup — 基於 Qt 的 Git 客戶端。
- Guitar — 一個 Git 的圖形化前端。
- gitui — 用 Rust 編寫的快速的 Git 終端用戶界面。
- Kommit — KDE 的 Git GUI 客戶端。
- lazygit — 一個簡潔的 Git TUI 工具。
- QGit — 可圖形化地按照不同開發分支顯示修訂歷史記錄、查閱補丁內容、查看被修改文件的 Git GUI 查看器。
- RabbitVCS — 一組圖形化工具,用於輕鬆、直接地訪問您使用的版本控制系統。
- Sublime Merge — 由 Sublime Text 開發商開發的 Git 前端。
- Tig — 基於 ncurses 的 git 字符模式前端。
- ungit — 在不犧牲 git 各種功能的情況下使其變得更加友好。
配置
你至少需要設置好姓名和郵箱之後才能開始使用 Git:
$ git config --global user.name "John Doe" $ git config --global user.email "johndoe@example.com"
更多設置選項可參閱#提示與技巧。
基本用法
一個 Git 版本庫包含在一個名為 .git
的目錄內,該目錄包含了修訂歷史以及其他元數據。版本庫所跟蹤的目錄(默認為父目錄)稱為工作目錄。在工作樹進行的更改在被提交 (commit) 前需要先暫存 (stage) 起來。Git 還可以讓你恢復以前提交的工作樹文件。
參見起步。
獲取 Git 倉庫
記錄更改
查看提交記錄
撤銷修改
分支 (branch)
分支與合併基礎
分支管理
分支開發工作流
遠程分支
變基
多人合作
分布式工作流
為已有項目貢獻
維護自己的項目
Git 工具
選擇修訂版本
交互式暫存
貯藏與清理
簽署工作
搜索
重寫歷史
重置揭密
高級合併
Rerere
使用 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
$ 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 伺服器推送時都要認證身份,你可能會想要避免這種麻煩。
- 如果你是用 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 或 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)")]\$ '
要自動完成這項工作,請參閱命令行解釋器#配置文件。
當切換至一個 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 對提交和標籤進行簽名,請參見簽署工作。
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 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/'"
HTML 幫助文件
通過安裝 git-htmldocsAUR,可以以 HTML 形式獲取 git help
文檔。安裝後,可以通過傳遞 -w
標誌來訪問 HTML 文檔。例如:
$ git help -w merge
可以通過設置 git config
選項默認加載 HTML 文檔:
$ git config --global help.format html
擴展
- gitflow-avh — 使用 Vincent Driessen 的分支模型擴展 git。AVH 版本增加了更多功能。
- git-extras — 一些 git 實用程序[存儲庫概覽、交互式命令行環境 (repl)、變更日誌填充、作者提交百分比等]
- https://github.com/tj/git-extras || git-extrasAUR⸺如果使用 oh-my-zsh,還可以啟用 git-extras 插件
- gitmoji-cli — 一個 gitmoji 交互式 NodeJS 客戶端,用於在提交消息中使用 gitmojis。