開發者日常使用的 Git 命令

jopen 10年前發布 | 57K 次閱讀 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)用來給已知點打標簽
  • </ul>

    實例

    用Tar包作為一個新代碼庫的起始點</span>

    $ 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. 打一個輕量的無注釋的標簽。
    3. </ol> </dt>
      創建一個主題分支并開發
      $ 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標簽開始的修改。
      13. </ol> </dd></dl>

         

        個人開發者(參與開發)

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

        • git-clone(1)從上游代碼庫填充你的本地代碼庫。
        • git-pull(1)git-fetch(1)從“origin”得到最新的上游代碼庫。
        • git-push(1)用來共享代碼庫,如果你采用cvs風格的代碼庫工作流的話。
        • git-format-patch(1)用來準備e-mail提交,如果你使用Linux內核風格的公共論壇工作流的話。
        • </ul>

          實例

          復制上游代碼庫并在其之上工作。提交修改到上游代碼庫</span>

          $ 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/ 。
          9. </ol> </dt>
            推進另一個代碼庫
            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></pre>

            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分支去。
            6. </ol> </dd>
              分支的特定標簽
              $ 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分支上。
              3. </ol> </dd></dl>

                集成人員

                在一個團隊項目中擔任集成者的是一名相當重要的人員,他接受別人的修改,評審并且集成并且發布結果,供他人使用;除了那些參與者需要的命令之外,還會使用這些命令。

                • git-am(1)用來采用你的貢獻者發電郵寄來的補丁文件。
                • git-pull(1)用來從你的可信任的助手處合并內容。
                • git-format-patch(1)用來準備并向你的貢獻者發送建議選項。
                • git-revert(1)用來撤銷不好的提交。
                • git-push(1)用來發布最新的內容。
                • </ul>

                  實例

                  我典型的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. 也推標簽
                  14. </ol> </dd></dl>

                    代碼庫管理

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

                    • git-daemon(1)允許匿名者從代碼庫下載
                    • git-shell(1)可以被用作為限制登錄shell,用于共享中央代碼庫的用戶
                    • </ul>

                      update hook howto有一個很好的管理共享中央代碼庫的實例。

                      實例

                      我們假設下面的內容均在/etc/services目錄下。</span>

                      $ 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行里。

                      </dt>
                      從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 }</pre>

                      檢查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需要的內容。
                      3. </ol>

                        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是發布經理,并且是唯一一位可以創建并推送版本標簽的人。
                        5. </ol>

                          支持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服務器。
                          3. </ol> </dd></dl>
                            原文鏈接: kernel.org   翻譯: 伯樂在線 - cjpan
                            譯文鏈接: http://blog.jobbole.com/54184/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!