歡迎您光臨本站 註冊首頁

開發者日常使用的 Git 命令

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

 
這些命令分四種類型:①不需要和其他開發者協作的獨立開發者,會經常用到 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代碼庫提交內容。

 

個人開發者(單獨開發)

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

  • git-init(1)用來創建新代碼庫。
  • git-show-branch(1)用來查看你在哪裡。
  • git-log(1)查看發生過什麼。
  • git-checkout(1)和git-branch(1)用來切換分支。
  • git-add(1)用來管理索引文件。
  • git-diff(1)和git-status(1)查看你正在做什麼。
  • git-commit(1)將內容推進現分支
  • git-reset(1)和git-checkout(1)(帶路徑名 參數)放棄修改。
  • git-merge(1)用來合併本地分支
  • git-rebase(1)用來維護主題分支
  • git-tag(1)用來給已知點打標籤

 

實例

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

 

1
2
3
4
5
6
$ 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. 打一個輕量的無註釋的標籤。
創建一個主題分支並開發
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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內核風格的公共論壇工作流的話。

實例

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

 

1
$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
1
2
3
4
5
6
7
8
9
$ 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/ 。
推進另一個代碼庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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分支去。
分支的特定標籤
1
2
3
4
5
$ 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-am(1)用來採用你的貢獻者發電郵寄來的補丁文件。
  • git-pull(1)用來從你的可信任的助手處合併內容。
  • git-format-patch(1)用來準備並向你的貢獻者發送建議選項。
  • git-revert(1)用來撤銷不好的提交。
  • git-push(1)用來發布最新的內容。

實例

我典型的GIT一天。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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上已有的代碼庫里,看起來像這樣:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ 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目錄下。

 

1
2
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ 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風格的共享代碼庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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伺服器

1
2
3
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



[火星人 ] 開發者日常使用的 Git 命令已經有832次圍觀

http://coctec.com/docs/program/show-post-71267.html