開發者日常使用的 Git 命令

jobbole發表於2013-12-27

  這些命令分四種型別:①不需要和其他開發者協作的獨立開發者,會經常用到 git init、git show branch、git commit 等命令;②需要和其他人協作的開發者,會常用到 git clone、git push、git pull、git format patch 。③在專案中負責接收其他開發者發來更新的核心開發者,會常用到 git am、git pull、git format patch、git revert、git push;④ 程式碼倉庫管理員常用 git daemon、git shell……

  對於任何想做提交的人來說,甚至對於某位單獨工作的人來說,【個人開發者(單獨開發)】部分命令都是必不可少的。如果你和別人一起工作,你也會需要【個人開發者(參與者)】部分列出的命令。

  除了上述的部分,擔當【整合人員】角色的人需要知道更多命令。【程式碼庫管理】命令幫助系統管理員負責管理,及向git程式碼庫提交內容。

 個人開發者(單獨開發)

  單獨的個人開發者不會與他人交換修補程式,只用到下列命令,獨自在單獨的程式碼庫上工作:

  例項

  用Tar包作為一個新程式碼庫的起始點

$ 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 checkout -b alsa-audio <1>
$ edit/compile/test
$ git checkout -- 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 reset --soft HEAD^ <6>
$ edit/compile/test
$ git diff ORIG_HEAD <7>
$ git commit -a -c ORIG_HEAD <8>
$ git checkout master <9>
$ git merge alsa-audio <10>
$ git log --since='3 days ago' <11>
$ git log v2.43.. curses/ <12>
  1. 建立一個主題分支。
  2. 還原你在curses/ux_audio_oss.c檔案裡搞砸了的修改。
  3. 如果你要新增一個新檔案是,你需要告訴git;之後,如果你使用git commit -a, 刪除和修改就會被捕獲。
  4. 檢視你正在提交什麼修改。
  5. 提交你已簽署了的所有已測試檔案。
  6. 退回到上一個提交,並保留工作樹。
  7. 檢視自從上一個不成熟提交後的修改。
  8. 使用原先寫過的資訊,重做在之前步驟中撤銷了的提交。
  9. 切換到主幹分支。
  10. 把主題分支合併到你的主分支。
  11. 回顧提交記錄;其他限制輸出的形式也可以合併包含: –max-count=10(顯示10個提交),–until=2005-12-10等
  12. 只檢視影響到在curses/目錄裡,從v2.43標籤開始的修改。

 個人開發者(參與開發)

  作為在一個團體專案裡參與角色的開發人員,需要學習如何與他人溝通,除了那些單獨開發者需要掌握的命令以外,還要使用這些命令。

  • git-clone(1)從上游程式碼庫填充你的原生程式碼庫。
  • git-pull(1)git-fetch(1)從“origin”得到最新的上游程式碼庫。
  • git-push(1)用來共享程式碼庫,如果你採用cvs風格的程式碼庫工作流的話。
  • git-format-patch(1)用來準備e-mail提交,如果你使用Linux核心風格的公共論壇工作流的話。

  例項

  複製上游程式碼庫並在其之上工作。提交修改到上游程式碼庫

$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
$ cd my2.6
$ edit/compile/test; git commit -a -s <1>
$ git format-patch origin <2>
$ git pull <3>
$ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <4>
$ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <5>
$ git reset --hard ORIG_HEAD <6>
$ git gc <7>
$ git fetch --tags <8>
  1. 按需重複。
  2. 從你的分支中提取補丁檔案,用於電子郵件提交。
  3. git pull命令預設從“origin”裡取得內容併合併到當前的分支中去。
  4. 在拉過內容之後,立即檢視在上游倉庫中從上次我們檢查過之後提交的修改,只檢查我們關心的區域。
  5. 從一個指定程式碼庫的一個指定分支獲取內容併合並。
  6. 撤銷拉操作。
  7. 從撤銷的拉操作中回收殘存的物件。
  8. 不時地,從origin處獲取官方的標籤,並儲存於.git/refs/tags/ 。

  推進另一個程式碼庫

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 \
           master:refs/remotes/satellite/master <3>
satellite$ edit/compile/test/commit
satellite$ git push origin <4>

mothership$ cd frotz
mothership$ git checkout master
mothership$ git merge satellite/master <5>
  1. mothership機器在你的home目錄下有一個frotz程式碼庫;將它複製,以在satellite機器上啟動一個程式碼庫。
  2. 複製操作預設設定這些配置變數。它安排git pull去抓取並儲存mothership機上的分支到本地的remotes/origin/* 的跟蹤分支上。
  3. 安排git push去推送本地的主分支到mothership機的remotes/satellite/master分支
  4. 推操作會在mothership機的remotes/satellite/master的遠端跟蹤分支上收藏我們的工作。你可以用此作為一個備用方法。
  5. 在mothership機上,將satellite機上已完成的工作合併到master分支去。

  分支的特定標籤

$ git checkout -b private2.6.14 v2.6.14 <1>
$ edit/compile/test; git commit -a
$ git checkout master
$ git format-patch -k -m --stdout v2.6.14..private2.6.14 |
  git am -3 -k <2>
  1. 建立一個私有分支,基於熟知(但稍許過時的)標籤。
  2. 在沒有正式的“合併”下,向前移植所有private2.6.14分支的修改到master分支上。

 整合人員

  在一個團隊專案中擔任整合者的是一名相當重要的人員,他接受別人的修改,評審並且整合並且釋出結果,供他人使用;除了那些參與者需要的命令之外,還會使用這些命令。

  例項

  我典型的GIT一天。

$ git status <1>
$ git show-branch <2>
$ mailx <3>
s 2 3 4 5 ./+to-apply
s 7 8 ./+hold-linus
q
$ git checkout -b topic/one master
$ git am -3 -i -s -u ./+to-apply <4>
$ compile/test
$ git checkout -b hold/linus && git am -3 -i -s -u ./+hold-linus <5>
$ git checkout topic/one && git rebase master <6>
$ git checkout pu && git reset --hard next <7>
$ git merge topic/one topic/two && git merge hold/linus <8>
$ git checkout maint
$ git cherry-pick master~4 <9>
$ compile/test
$ git tag -s -m "GIT 0.99.9x" v0.99.9x <10>
$ git fetch ko && git show-branch master maint 'tags/ko-*' <11>
$ git push ko <12>
$ git push ko v0.99.9x <13>
  1. 檢視我正在做什麼,如果有的話。
  2. 檢視我擁有的主題分支,並考慮它們的完成度。
  3. 讀郵件,儲存合適的,並且儲存那些尚未完成的。
  4. 採用它們,互動式地,帶著我的簽名。
  5. 按需建立主題分支,還是由我簽名採用。
  6. 為內部的還未合併到主分支,也沒有作為穩定分支的一部分公開的主題分支重定基線。
  7. 從接下來開始,每次都重啟pu。
  8. 合併仍然在料理中的主題分支
  9. 向後移植極其重要的修正。
  10. 建立一個簽名的標籤。
  11. 確保我不會意外將主分支回滾到我已經推出來的內容。簡寫的ko指向我在kernel.org上已有的程式碼庫裡,看起來像這樣:
    $ cat .git/remotes/ko
    URL: kernel.org:/pub/scm/git/git.git
    Pull: master:refs/tags/ko-master
    Pull: next:refs/tags/ko-next
    Pull: maint:refs/tags/ko-maint
    Push: master
    Push: next
    Push: +pu
    Push: maint

    在從git show-branch的輸出裡,主分支應該有所有ko-master有的,並且next應該有ko-next有的所有內容。

  12. 推出最新內容
  13. 也推標籤

 程式碼庫管理

  程式碼庫管理員使用下列工具來設定及維護開發者對程式碼庫的訪問。

  • git-daemon(1)允許匿名者從程式碼庫下載
  • git-shell(1)可以被用作為限制登入shell,用於共享中央程式碼庫的使用者

  update hook howto有一個很好的管理共享中央程式碼庫的例項。

  例項

  我們假設下面的內容均在/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

  實際的配置應該在1行裡。

  從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系統。其他也許會不一樣。

  授予開發者只推/拉訪問操作許可權。

$ 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 push和git 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 -&gt; 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可以推送到主分支,只有bob可以推送進doc-update。david是釋出經理,並且是唯一一位可以建立並推送版本標籤的人。

  支援dumb協議傳送的HTTP伺服器

dev$ git update-server-info <1>
dev$ ftp user@isp.example.com <2>
ftp&gt; cp -r .git /home/user/myproject.git
  1. 確保你的info/refes和objects/info/packs是最新的。
  2. 上傳到由你的ISP擁有的公共HTTP伺服器。

  原文連結: kernel.org   翻譯: 伯樂線上 - cjpan

相關文章