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

名稱

giteveryday - 日常 Git 的有用最小命令集

概要

日常 Git 的大約 20 個命令

描述

為了此處描述一組用於日常 Git 的有用命令,Git 使用者可以大致分為四類。

獨立開發者(Standalone)

獨立開發者不與其他人交換補丁,獨自在單個倉庫中工作,使用以下命令。

示例

使用 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. clone 預設設定這些配置變數。它安排 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 或 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. 對尚未合併到 master 或作為穩定分支一部分暴露的內部主題分支進行 rebase。

  7. 每次都從 next 重新開始 seen

  8. 並打包仍在進行中的主題分支。

  9. 回溯移植一個關鍵修復。

  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] 指令碼進行設定。

更新鉤子教程 提供了一個管理共享中心倉庫的好示例。

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

  • 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