開發者日常使用的 Git 命令
這些命令分四種型別:①不需要和其他開發者協作的獨立開發者,會經常用到 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包作為一個新程式碼庫的起始點
$ 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>
- 新增現目錄下的所有檔案。
- 打一個輕量的無註釋的標籤。
建立一個主題分支並開發
$ 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>
- 建立一個主題分支。
- 還原你在curses/ux_audio_oss.c檔案裡搞砸了的修改。
- 如果你要新增一個新檔案是,你需要告訴git;之後,如果你使用git commit -a, 刪除和修改就會被捕獲。
- 檢視你正在提交什麼修改。
- 提交你已簽署了的所有已測試檔案。
- 退回到上一個提交,並保留工作樹。
- 檢視自從上一個不成熟提交後的修改。
- 使用原先寫過的資訊,重做在之前步驟中撤銷了的提交。
- 切換到主幹分支。
- 把主題分支合併到你的主分支。
- 回顧提交記錄;其他限制輸出的形式也可以合併包含: –max-count=10(顯示10個提交),–until=2005-12-10等
- 只檢視影響到在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>
- 按需重複。
- 從你的分支中提取補丁檔案,用於電子郵件提交。
- git pull命令預設從“origin”裡取得內容併合併到當前的分支中去。
- 在拉過內容之後,立即檢視在上游倉庫中從上次我們檢查過之後提交的修改,只檢查我們關心的區域。
- 從一個指定程式碼庫的一個指定分支獲取內容併合並。
- 撤銷拉操作。
- 從撤銷的拉操作中回收殘存的物件。
- 不時地,從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>
- mothership機器在你的home目錄下有一個frotz程式碼庫;將它複製,以在satellite機器上啟動一個程式碼庫。
- 複製操作預設設定這些配置變數。它安排git pull去抓取並儲存mothership機上的分支到本地的remotes/origin/* 的跟蹤分支上。
- 安排git push去推送本地的主分支到mothership機的remotes/satellite/master分支
- 推操作會在mothership機的remotes/satellite/master的遠端跟蹤分支上收藏我們的工作。你可以用此作為一個備用方法。
- 在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>
- 建立一個私有分支,基於熟知(但稍許過時的)標籤。
- 在沒有正式的“合併”下,向前移植所有private2.6.14分支的修改到master分支上。
整合人員
在一個團隊專案中擔任整合者的是一名相當重要的人員,他接受別人的修改,評審並且整合並且釋出結果,供他人使用;除了那些參與者需要的命令之外,還會使用這些命令。
- git-am(1)用來採用你的貢獻者發電郵寄來的補丁檔案。
- git-pull(1)用來從你的可信任的助手處合併內容。
- git-format-patch(1)用來準備並向你的貢獻者傳送建議選項。
- git-revert(1)用來撤銷不好的提交。
- git-push(1)用來發布最新的內容。
例項
我典型的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>
- 檢視我正在做什麼,如果有的話。
- 檢視我擁有的主題分支,並考慮它們的完成度。
- 讀郵件,儲存合適的,並且儲存那些尚未完成的。
- 採用它們,互動式地,帶著我的簽名。
- 按需建立主題分支,還是由我簽名採用。
- 為內部的還未合併到主分支,也沒有作為穩定分支的一部分公開的主題分支重定基線。
- 從接下來開始,每次都重啟pu。
- 合併仍然在料理中的主題分支
- 向後移植極其重要的修正。
- 建立一個簽名的標籤。
-
確保我不會意外將主分支回滾到我已經推出來的內容。簡寫的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有的所有內容。
- 推出最新內容
- 也推標籤
程式碼庫管理
程式碼庫管理員使用下列工具來設定及維護開發者對程式碼庫的訪問。
- 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
- 登入shell被設定到/usr/bin/git-shell, 不允許git push和git pull以外的任何操作。使用者應該會獲得一個訪問此機器的ssh許可權。
- 在許多釋出版本中,/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
- 把開發者置於同一git組中。
- 將共享程式碼庫配為可被組寫。
- 使用Carl的update-hook例項,這個例項在Documentation/howto/, 講述了分支策略控制。
- alice和cindy可以推送到主分支,只有bob可以推送進doc-update。david是釋出經理,並且是唯一一位可以建立並推送版本標籤的人。
支援dumb協議傳送的HTTP伺服器
dev$ git update-server-info <1> dev$ ftp user@isp.example.com <2> ftp> cp -r .git /home/user/myproject.git
- 確保你的info/refes和objects/info/packs是最新的。
- 上傳到由你的ISP擁有的公共HTTP伺服器。
原文連結: kernel.org 翻譯: 伯樂線上 - cjpan
相關文章
- 所用的日常 Git 命令Git
- Git的日常使用Git
- git 日常使用小冊Git
- Git 記不住的偶爾用的命令(日常更新)Git
- 日常使用 Git 的 19 個建議Git
- Git 日常操作Git
- Git日常常用命令和ADB常用命令Git
- Git 命令列使用Git命令列
- 日常命令
- Git 的日常工作用法Git
- Git 命令使用記錄Git
- git命令使用方法Git
- Git 命令使用心得Git
- 使用 Git 撤銷 Commit,但未 Git Push 的命令GitMIT
- oracle日常命令Oracle
- oracle 日常命令Oracle
- Git命令的使用和相關配置Git
- git的基本概念及命令使用Git
- git的使用命令和講解Git
- git命令使用(必備系列)Git
- git命令使用(適合新手)Git
- git stash 命令簡單使用Git
- 使用分支——Git Merge命令Git
- Git的命令Git
- git的基本命令使用演示視訊Git
- 使用者使用git常用的基本命令(一)Git
- git寶典—應付日常工作使用足夠的指北手冊Git
- Git命令簡潔使用指南Git
- GIT非常見命令使用筆記Git筆記
- git在windows命令列下使用GitWindows命令列
- JB的git之旅-git命令列Git命令列
- Git-命令列-使用 git stash 暫存程式碼Git命令列
- 這有一份 Git 日常使用清單,你需要嗎?Git
- 這有一份 git 日常使用清單,你需要嗎Git
- 「Git」使用筆記 「Git」指令大全 「Git」命令5分鐘入門Git筆記
- DG日常檢查命令
- VI 日常命令來大全
- Oracle RAC日常管理命令Oracle