設定與配置
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.43.1 → 2.47.0 沒有變更
-
2.43.0
11/20/23
- 2.28.1 → 2.42.3 沒有變更
-
2.28.0
07/27/20
- 2.23.1 → 2.27.1 沒有變更
-
2.23.0
08/16/19
- 2.19.1 → 2.22.5 沒有變更
-
2.19.0
09/10/18
- 2.13.7 → 2.18.5 沒有變更
-
2.12.5
09/22/17
- 2.7.6 → 2.11.4 沒有變更
-
2.6.7
05/05/17
- 2.3.10 → 2.5.6 沒有變更
-
2.2.3
09/04/15
描述
為了描述一套實用的日常 Git 指令,這裡將 Git 使用者大致分為四類。
-
獨立開發者(獨立)指令對於任何提交的人來說都是必要的,即使是獨自工作的人也是如此。
-
如果您與其他人一起工作,您也需要 獨立開發者(參與者)部分中列出的指令。
-
扮演 整合者 角色的人除了上述指令之外,還需要學習一些其他指令。
-
儲存庫管理指令適用於負責 Git 儲存庫維護的系統管理員。
獨立開發者(獨立)
獨立的開發人員不與其他人交換補丁,並且在單個儲存庫中單獨工作,使用以下指令。
-
git-init[1] 建立新的儲存庫。
-
git-log[1] 查看發生了什麼事。
-
git-switch[1] 和 git-branch[1] 切換分支。
-
git-add[1] 管理索引檔案。
-
git-diff[1] 和 git-status[1] 查看您正在做的事情。
-
git-commit[1] 前進目前分支。
-
git-restore[1] 還原變更。
-
git-merge[1] 在本地分支之間合併。
-
git-rebase[1] 維護主題分支。
-
git-tag[1] 標記已知點。
範例
- 使用 tarball 作為新儲存庫的起點。
-
$ tar zxf frotz.tar.gz $ cd frotz $ git init $ git add . (1) $ git commit -m "import of frotz source tree." $ git tag v2.43 (2)
-
新增目前目錄下的所有內容。
-
建立輕量級、未註解的標籤。
-
- 建立主題分支並開發。
-
$ git switch -c alsa-audio (1) $ edit/compile/test $ git restore curses/ux_audio_oss.c (2) $ git add curses/ux_audio_alsa.c (3) $ edit/compile/test $ git diff HEAD (4) $ git commit -a -s (5) $ edit/compile/test $ git diff HEAD^ (6) $ git commit -a --amend (7) $ git switch master (8) $ git merge alsa-audio (9) $ git log --since='3 days ago' (10) $ git log v2.43.. curses/ (11)
-
建立新的主題分支。
-
還原您在
curses/ux_audio_oss.c
中搞砸的變更。 -
如果您新增了一個新檔案,您需要告訴 Git;如果您稍後執行
git commit -a
,則會抓取移除和修改。 -
查看您正在提交的變更。
-
提交所有已測試過的內容,並加上您的簽名。
-
查看您所有的變更,包括先前的提交。
-
修改先前的提交,新增您所有的新變更,並使用您原始的訊息。
-
切換到 master 分支。
-
將主題分支合併到您的 master 分支。
-
檢閱提交日誌;其他限制輸出的形式可以組合使用,包括
-10
(顯示最多 10 個提交)、--until=2005-12-10
等。 -
自
v2.43
標籤以來,僅檢視觸及curses/
目錄的變更。
-
獨立開發者(參與者)
作為團隊專案中的參與者工作的開發人員需要學習如何與他人溝通,並且除了獨立開發人員所需的指令外,還使用這些指令。
-
git-clone[1] 從上游複製,以啟動您的本機儲存庫。
-
git-pull[1] 和 git-fetch[1] 從 "origin" 保持與上游同步。
-
git-push[1] 如果您採用 CVS 風格的共享儲存庫工作流程,則推送到共享儲存庫。
-
git-format-patch[1] 如果您採用 Linux 核心風格的公共論壇工作流程,則準備電子郵件提交。
-
git-send-email[1] 發送您的電子郵件提交,而不會被您的 MUA 損壞。
-
git-request-pull[1] 建立變更摘要供您的上游提取。
範例
- 複製上游並在其上工作。將變更饋送到上游。
-
$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6 $ cd my2.6 $ git switch -c mine master (1) $ edit/compile/test; git commit -a -s (2) $ git format-patch master (3) $ git send-email --to="person <email@example.com>" 00*.patch (4) $ git switch master (5) $ git pull (6) $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 (7) $ git ls-remote --heads http://git.kernel.org/.../jgarzik/libata-dev.git (8) $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL (9) $ git reset --hard ORIG_HEAD (10) $ git gc (11)
-
從 master 簽出一個新分支
mine
。 -
根據需要重複。
-
從您的分支提取相對於 master 的補丁,
-
並以電子郵件發送它們。
-
返回
master
,準備查看新內容 -
git pull
預設從origin
提取並合併到目前分支。 -
在提取後立即查看我們上次檢查以來上游所做的變更,僅限於我們感興趣的區域。
-
檢查外部儲存庫中的分支名稱(如果未知)。
-
從特定儲存庫的特定分支
ALL
提取並合併它。 -
還原提取。
-
從還原的提取中清除剩餘的物件。
-
- 推送到另一個儲存庫。
-
satellite$ git clone mothership:frotz frotz (1) satellite$ cd frotz satellite$ git config --get-regexp '^(remote|branch)\.' (2) remote.origin.url mothership:frotz remote.origin.fetch refs/heads/*:refs/remotes/origin/* branch.master.remote origin branch.master.merge refs/heads/master satellite$ git config remote.origin.push \ +refs/heads/*:refs/remotes/satellite/* (3) satellite$ edit/compile/test/commit satellite$ git push origin (4) mothership$ cd frotz mothership$ git switch master mothership$ git merge satellite/master (5)
-
母艦機器在您的主目錄下有一個 frotz 儲存庫;從它複製以在衛星機器上啟動儲存庫。
-
複製預設會設定這些配置變數。它安排
git pull
來提取並將母艦機器的分支儲存到本機remotes/origin/*
遠端追蹤分支。 -
安排
git push
將所有本機分支推送到母艦機器上對應的分支。 -
推送會將我們所有的工作隱藏在母艦機器上的
remotes/satellite/*
遠端追蹤分支中。您可以將其用作備份方法。同樣,您可以假裝母艦從您那裡「提取」(當存取是單向時很有用)。 -
在母艦機器上,將衛星機器上完成的工作合併到 master 分支中。
-
- 從特定標籤分支出來。
-
$ git switch -c private2.6.14 v2.6.14 (1) $ edit/compile/test; git commit -a $ git checkout master $ git cherry-pick v2.6.14..private2.6.14 (2)
-
基於眾所周知(但有些落後)的標籤建立一個私有分支。
-
將
private2.6.14
分支中的所有變更轉移到master
分支,而無需正式「合併」。或完整形式
git format-patch -k -m --stdout v2.6.14..private2.6.14 | git am -3 -k
-
另一種參與者提交機制是使用 git request-pull
或提取請求機制(例如 GitHub(www.github.com)上使用的機制)來通知您的上游您的貢獻。
整合者
在團隊專案中,作為整合者的核心人員接收其他人所做的變更,檢閱並整合它們,並發佈結果供其他人使用,除了參與者所需的指令外,還使用這些指令。
此部分也可以供那些回覆 GitHub(www.github.com)上的 git request-pull
或提取請求,將其他人的工作整合到他們的歷史記錄中的人使用。儲存庫的子區域主管將同時作為參與者和整合者。
-
git-am[1] 應用您的貢獻者以電子郵件發送的修補程式。
-
git-pull[1] 從您信任的副手合併。
-
git-format-patch[1] 準備並向貢獻者發送建議的替代方案。
-
git-revert[1] 還原搞砸的提交。
-
git-push[1] 發佈最新版本。
範例
- 典型的整合者的 Git 日常。
-
$ git status (1) $ git branch --no-merged master (2) $ mailx (3) & s 2 3 4 5 ./+to-apply & s 7 8 ./+hold-linus & q $ git switch -c topic/one master $ git am -3 -i -s ./+to-apply (4) $ compile/test $ git switch -c hold/linus && git am -3 -i -s ./+hold-linus (5) $ git switch topic/one && git rebase master (6) $ git switch -C seen next (7) $ git merge topic/one topic/two && git merge hold/linus (8) $ git switch maint $ git cherry-pick master~4 (9) $ compile/test $ git tag -s -m "GIT 0.99.9x" v0.99.9x (10) $ git fetch ko && for branch in master maint next seen (11) do git show-branch ko/$branch $branch (12) done $ git push --follow-tags ko (13)
-
看看您正在做的事情,如果有的話。
-
查看哪些分支尚未合併到
master
中。同樣適用於任何其他整合分支,例如maint
、next
和seen
。 -
閱讀電子郵件,儲存適用的電子郵件,並儲存其他尚未準備好的電子郵件(可以使用其他郵件讀取器)。
-
互動式應用它們,並加上您的簽名。
-
根據需要建立主題分支並應用,同樣加上簽名。
-
變基(rebase)尚未合併到主分支或作為穩定分支一部分公開的內部主題分支。
-
每次從下一個提交開始重新啟動
seen
。 -
並打包仍在開發中的主題分支。
-
向後移植一個關鍵修復。
-
建立一個已簽署的標籤。
-
確保主分支沒有意外地回溯到已推送的提交之前。
-
在
git show-branch
的輸出中,master
應該包含ko/master
的所有內容,而next
應該包含ko/next
的所有內容,依此類推。 -
推送最前沿的更新,以及指向已推送歷史的新標籤。
-
在這個例子中,ko
這個簡稱指向 kernel.org 上 Git 維護者的儲存庫,看起來像這樣
(in .git/config) [remote "ko"] url = kernel.org:/pub/scm/git/git.git fetch = refs/heads/*:refs/remotes/ko/* push = refs/heads/master push = refs/heads/next push = +refs/heads/seen push = refs/heads/maint
儲存庫管理
儲存庫管理員使用以下工具來設定和維護開發人員對儲存庫的存取權。
-
git-daemon[1] 允許從儲存庫匿名下載。
-
git-shell[1] 可以作為共享中心儲存庫用戶的受限登入 shell。
-
git-http-backend[1] 提供了 Git-over-HTTP(「Smart http」)的伺服器端實作,允許提取(fetch)和推送(push)服務。
-
gitweb[1] 為 Git 儲存庫提供了 Web 前端,可以使用 git-instaweb[1] 指令碼進行設定。
更新鉤子(update hook)使用說明 有一個關於管理共享中心儲存庫的好例子。
此外,還有許多其他廣泛部署的託管、瀏覽和審閱解決方案,例如
-
gitolite、gerrit code review、cgit 等等。
範例
- 我們假設 /etc/services 中有以下內容
-
$ grep 9418 /etc/services git 9418/tcp # Git Version Control System
- 從 inetd 執行 git-daemon 以服務 /pub/scm。
-
$ grep git /etc/inetd.conf git stream tcp nowait nobody \ /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
實際的設定行應在一行上。
- 從 xinetd 執行 git-daemon 以服務 /pub/scm。
-
$ cat /etc/xinetd.d/git-daemon # default: off # description: The Git server offers access to Git repositories service git { disable = no type = UNLISTED port = 9418 socket_type = stream wait = no user = nobody server = /usr/bin/git-daemon server_args = --inetd --export-all --base-path=/pub/scm log_on_failure += USERID }
請查閱您的 xinetd(8) 文件和設定,這是來自 Fedora 系統的設定。其他系統可能會有所不同。
- 使用 git-over-ssh 為開發人員提供僅推送/提取的權限。
-
例如,使用以下命令的開發人員:
$ git push/pull ssh://host.xz/pub/scm/project
$ grep git /etc/passwd (1) alice:x:1000:1000::/home/alice:/usr/bin/git-shell bob:x:1001:1001::/home/bob:/usr/bin/git-shell cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell david:x:1003:1003::/home/david:/usr/bin/git-shell $ grep git /etc/shells (2) /usr/bin/git-shell
-
登入 shell 設定為 /usr/bin/git-shell,它只允許
git push
和git pull
。使用者需要 SSH 存取權才能連接到機器。 -
在許多發行版中,/etc/shells 需要列出用作登入 shell 的內容。
-
-
$ grep git /etc/group (1) git:x:9418:alice,bob,cindy,david $ cd /home/devo.git $ ls -l (2) lrwxrwxrwx 1 david git 17 Dec 4 22:40 HEAD -> refs/heads/master drwxrwsr-x 2 david git 4096 Dec 4 22:40 branches -rw-rw-r-- 1 david git 84 Dec 4 22:40 config -rw-rw-r-- 1 david git 58 Dec 4 22:40 description drwxrwsr-x 2 david git 4096 Dec 4 22:40 hooks -rw-rw-r-- 1 david git 37504 Dec 4 22:40 index drwxrwsr-x 2 david git 4096 Dec 4 22:40 info drwxrwsr-x 4 david git 4096 Dec 4 22:40 objects drwxrwsr-x 4 david git 4096 Nov 7 14:58 refs drwxrwsr-x 2 david git 4096 Dec 4 22:40 remotes $ ls -l hooks/update (3) -r-xr-xr-x 1 david git 3536 Dec 4 22:40 update $ cat info/allowed-users (4) refs/heads/master alice\|cindy refs/heads/doc-update bob refs/tags/v[0-9]* david
-
將開發人員放入同一個 git 群組中。
-
並使該群組可寫入共享儲存庫。
-
使用 Documentation/howto/ 中 Carl 的 update-hook 範例來進行分支策略控制。
-
alice 和 cindy 可以推送到 master 分支,只有 bob 可以推送到 doc-update 分支。david 是發布管理員,並且是唯一可以建立和推送版本標籤的人。
-
GIT
屬於 git[1] 套件的一部分