簡體中文 ▾ 主題 ▾ 最新版本 ▾ giteveryday 最後更新於 2.43.0

名稱

giteveryday - 適用於日常 Git 的有用命令集

概要

日常 Git 的大約 20 條命令

描述

為了在此描述一套適用於日常 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[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)
  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. mothership 機器在您的主目錄下有一個 frotz 倉庫;從它克隆以在衛星機器上啟動一個倉庫。

  2. clone 預設設定了這些配置變數。它安排 git pull 獲取並將 mothership 機器的分支儲存在本地 remotes/origin/* 遠端跟蹤分支中。

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

  4. push 將把我們在 remotes/satellite/* 遠端跟蹤分支上完成的所有工作暫存到 mothership 機器上。您可以使用此作為備份方法。同樣,您可以假裝 mothership 從您那裡“獲取”了(當訪問是單向的時很有用)。

  5. 在 mothership 機器上,將衛星機器上完成的工作合併到 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 或 pull-request 機制(例如,如 GitHub (www.github.com) 上所用),以通知您的上游您的貢獻。

整合者

在團隊專案中充當整合者的相對核心人物接收他人的更改,審查並整合它們,然後釋出結果供他人使用,他使用這些命令(除了參與者所需的命令之外)。

此部分也可供那些響應 GitHub (www.github.com) 上的 git request-pull 或 pull-request 來將他人的工作整合到其歷史中的人使用。儲存庫的子區域負責人將同時充當參與者和整合者。

示例

典型的整合者的 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 內部主題分支,該分支尚未合併到 master 或作為穩定分支的一部分公開。

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

  8. 並捆綁仍在進行中的主題分支。

  9. backport 關鍵修復。

  10. 建立已簽名的標籤。

  11. 確保 master 沒有被意外回溯到比已推送內容更早的版本。

  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”)的伺服器端實現,允許獲取和推送服務。

  • gitweb[1] 提供 Git 倉庫的 Web 前端,可以使用 git-instaweb[1] 指令碼進行設定。

update hook howto 提供了管理共享中心倉庫的一個很好的示例。

此外,還有許多其他廣泛部署的託管、瀏覽和審查解決方案,例如

  • gitolite、gerrit code review、cgit 等。

示例

我們在 /etc/services 中假定以下內容
$ grep 9418 /etc/services
git		9418/tcp		# Git Version Control System
執行 git-daemon 透過 inetd 服務 /pub/scm。
$ grep git /etc/inetd.conf
git	stream	tcp	nowait	nobody \
  /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm

實際的配置行應在同一行。

執行 git-daemon 透過 xinetd 服務 /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. 使用 Carl 提供的 update-hook 示例(位於 Documentation/howto/)進行分支策略控制。

  4. alice 和 cindy 可以推送到 master,只有 bob 可以推送到 doc-update。david 是釋出經理,也是唯一可以建立和推送版本標籤的人。

GIT

Git[1] 套件的一部分