Git
English ▾ 主題 ▾ 最新版本 ▾ giteveryday 最後更新於 2.43.0

名稱

giteveryday - 一組實用的日常 Git 最低限度指令

概要

大約 20 個常用指令的日常 Git

描述

為了描述一套實用的日常 Git 指令,這裡將 Git 使用者大致分為四類。

獨立開發者(獨立)

獨立的開發人員不與其他人交換補丁,並且在單個儲存庫中單獨工作,使用以下指令。

範例

使用 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)
  1. 新增目前目錄下的所有內容。

  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)
  1. 建立新的主題分支。

  2. 還原您在 curses/ux_audio_oss.c 中搞砸的變更。

  3. 如果您新增了一個新檔案,您需要告訴 Git;如果您稍後執行 git commit -a,則會抓取移除和修改。

  4. 查看您正在提交的變更。

  5. 提交所有已測試過的內容,並加上您的簽名。

  6. 查看您所有的變更,包括先前的提交。

  7. 修改先前的提交,新增您所有的新變更,並使用您原始的訊息。

  8. 切換到 master 分支。

  9. 將主題分支合併到您的 master 分支。

  10. 檢閱提交日誌;其他限制輸出的形式可以組合使用,包括 -10(顯示最多 10 個提交)、--until=2005-12-10 等。

  11. v2.43 標籤以來,僅檢視觸及 curses/ 目錄的變更。

獨立開發者(參與者)

作為團隊專案中的參與者工作的開發人員需要學習如何與他人溝通,並且除了獨立開發人員所需的指令外,還使用這些指令。

範例

複製上游並在其上工作。將變更饋送到上游。
$ 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)
  1. 從 master 簽出一個新分支 mine

  2. 根據需要重複。

  3. 從您的分支提取相對於 master 的補丁,

  4. 並以電子郵件發送它們。

  5. 返回 master,準備查看新內容

  6. git pull 預設從 origin 提取並合併到目前分支。

  7. 在提取後立即查看我們上次檢查以來上游所做的變更,僅限於我們感興趣的區域。

  8. 檢查外部儲存庫中的分支名稱(如果未知)。

  9. 從特定儲存庫的特定分支 ALL 提取並合併它。

  10. 還原提取。

  11. 從還原的提取中清除剩餘的物件。

推送到另一個儲存庫。
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)
  1. 母艦機器在您的主目錄下有一個 frotz 儲存庫;從它複製以在衛星機器上啟動儲存庫。

  2. 複製預設會設定這些配置變數。它安排 git pull 來提取並將母艦機器的分支儲存到本機 remotes/origin/* 遠端追蹤分支。

  3. 安排 git push 將所有本機分支推送到母艦機器上對應的分支。

  4. 推送會將我們所有的工作隱藏在母艦機器上的 remotes/satellite/* 遠端追蹤分支中。您可以將其用作備份方法。同樣,您可以假裝母艦從您那裡「提取」(當存取是單向時很有用)。

  5. 在母艦機器上,將衛星機器上完成的工作合併到 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)
  1. 基於眾所周知(但有些落後)的標籤建立一個私有分支。

  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 日常。
$ 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)
  1. 看看您正在做的事情,如果有的話。

  2. 查看哪些分支尚未合併到 master 中。同樣適用於任何其他整合分支,例如 maintnextseen

  3. 閱讀電子郵件,儲存適用的電子郵件,並儲存其他尚未準備好的電子郵件(可以使用其他郵件讀取器)。

  4. 互動式應用它們,並加上您的簽名。

  5. 根據需要建立主題分支並應用,同樣加上簽名。

  6. 變基(rebase)尚未合併到主分支或作為穩定分支一部分公開的內部主題分支。

  7. 每次從下一個提交開始重新啟動 seen

  8. 並打包仍在開發中的主題分支。

  9. 向後移植一個關鍵修復。

  10. 建立一個已簽署的標籤。

  11. 確保主分支沒有意外地回溯到已推送的提交之前。

  12. git show-branch 的輸出中,master 應該包含 ko/master 的所有內容,而 next 應該包含 ko/next 的所有內容,依此類推。

  13. 推送最前沿的更新,以及指向已推送歷史的新標籤。

在這個例子中,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
  1. 登入 shell 設定為 /usr/bin/git-shell,它只允許 git pushgit pull。使用者需要 SSH 存取權才能連接到機器。

  2. 在許多發行版中,/etc/shells 需要列出用作登入 shell 的內容。

CVS 風格的共享儲存庫。
$ 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
  1. 將開發人員放入同一個 git 群組中。

  2. 並使該群組可寫入共享儲存庫。

  3. 使用 Documentation/howto/ 中 Carl 的 update-hook 範例來進行分支策略控制。

  4. alice 和 cindy 可以推送到 master 分支,只有 bob 可以推送到 doc-update 分支。david 是發布管理員,並且是唯一可以建立和推送版本標籤的人。

GIT

屬於 git[1] 套件的一部分

scroll-to-top