iOS - 提交更新到倉庫(分布式版本控制系統)

來源:互聯網
上載者:User

標籤:markdown   跳過   submit   關於   展開   組建檔案   pid   技術分享   sage   

1、Git 檔案生命週期
  • 工作目錄下的每一個檔案都不外乎這兩種狀態:已跟蹤或未跟蹤。

  • 已跟蹤的檔案是指那些被納入了版本控制的檔案,在上一次快照中有它們的記錄,在工作一段時間後,它們的狀態可能處於未修改,已修改或已放入暫存區。

  • 工作目錄中除已追蹤檔案以外的所有其它檔案都屬於未追蹤檔案,它們既不存在於上次快照的記錄中,也沒有放入暫存區。

  • 初次複製某個倉庫的時候,工作目錄中的所有檔案都屬於已追蹤檔案,並處於未修改狀態。編輯過某些檔案之後,由於自上次提交後你對它們做了修改,Git 將它們標記為已修改檔案。我們逐步將這些修改過的檔案放入暫存區,然後提交所有暫存了的修改,如此反覆。所以使用 Git 時檔案的生命週期如下。

2、檢查當前檔案狀態
  • 要查看哪些檔案處於什麼狀態,可以用 git status 命令。如果在複製倉庫後立即使用此命令,會看到類似這樣的輸出。

    $ git status
    On branch masterYour branch is up to date with 'origin/master'.
    • 這說明你現在的工作目錄相當乾淨。換句話說,所有已追蹤檔案在上次提交後都未被更改過。
    • 此外,上面的資訊還表明,目前的目錄下沒有出現任何處於未跟蹤狀態的新檔案,否則 Git 會在這裡列出來。
    • 最後,該命令還顯示了當前所在分支,並告訴你這個分支同遠程伺服器上對應的分支沒有偏離。現在,分支名是 “master”,這是預設的分支名。
  • 現在,讓我們在項目下建立一個新的 README 檔案。如果之前並不存在這個檔案,使用 git status 命令,你將看到一個新的未追蹤檔案。

    $ echo 'My Project' > README
    $ git statusOn branch masterYour branch is up to date with 'origin/master'.Untracked files:  (use "git add <file>..." to include in what will be committed)    READMEnothing added to commit but untracked files present (use "git add" to track)
    • 在狀態報表中可以看到建立的 README 檔案出現在 Untracked files 下面。未跟蹤的檔案意味著 Git 在之前的快照(提交)中沒有這些檔案;Git 不會自動將之納入跟蹤範圍,除非你明明白白地告訴它“我需要跟蹤該檔案”,這樣的處理讓你不必擔心將產生的二進位檔案或其它不想被跟蹤的檔案包含進來。
  • git status 命令的輸出十分詳細,但其用語有些繁瑣。如果你使用 git status -s 命令或 git status --short 命令,你將得到一種更為緊湊的格式輸出。

    $ git status -s# 或$ git status --short
     M READMEMM RakefileA  lib/git.rbM  lib/simplegit.rb?? LICENSE.txt
    • ??:新添加的未追蹤檔案。

    • A :新添加到暫存區中的檔案。

    • M :修改過的檔案。

    • 出現在靠右邊的 M 表示該檔案被修改了但是還沒放入暫存區。
    • 出現在靠左邊的 M 表示該檔案被修改了並放入了暫存區。

    • 上面的狀態報表顯示:
      • README 檔案在工作區被修改了但是還沒有將修改後的檔案放入暫存區。
      • lib/simplegit.rb 檔案被修改了並將修改後的檔案放入了暫存區。
      • Rakefile 在工作區被修改並提交到暫存區後又在工作區中被修改了,所以在暫存區和工作區都有該檔案被修改了的記錄。
3、跟蹤新檔案
  • 使用命令 git add 開始跟蹤一個檔案。所以,要跟蹤 README 檔案,運行以下命令。

    # git add [檔案名稱]$ git add README
    • git add 命令使用檔案或目錄的路徑作為參數,如果參數是目錄的路徑,該命令將遞迴地跟蹤該目錄下的所有檔案。
  • 此時再運行 git status 命令,會看到 README 檔案已被跟蹤,並處於暫存狀態。

    $ git statusOn branch masterYour branch is up to date with 'origin/master'.Changes to be committed:  (use "git reset HEAD <file>..." to unstage)    new file:   README
    • 只要在 Changes to be committed 這行下面的,就說明是已暫存狀態。如果此時提交,那麼該檔案此時此刻的版本將被留存在記錄中。
4、暫存已修改檔案
  • 現在我們來修改一個已被跟蹤的檔案。如果你修改了一個名為 CONTRIBUTING.md 的已被跟蹤的檔案,然後運
    git status 命令,會看到下面內容。

    $ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)    new file:   READMEChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)    modified:   CONTRIBUTING.md
    • 檔案 CONTRIBUTING.md 出現在 Changes not staged for commit 這行下面,說明已追蹤檔案的內容發生了變化,但還沒有放到暫存區。
  • 要暫存這次更新,需要運行 git add 命令。

    # git add [檔案名稱]$ git add CONTRIBUTING.md
    • git add 命令是個多功能命令:可以用它開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用於合并時把有衝突的檔案標記為已解決狀態等。將這個命令理解為“新增內容到下一次提交中”而不是“將一個檔案添加到項目中”要更加合適。
  • 將"CONTRIBUTING.md"放到暫存區後再看看 git status 的輸出。

    $ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)    new file:   README    modified:   CONTRIBUTING.md
    • 現在兩個檔案都已暫存,下次提交時就會一併記錄到倉庫。
  • 假設此時,你想要在 CONTRIBUTING.md 裡再加條注釋,重新編輯存檔後,準備好提交。不過再運行 git status 看看。

    $ vim CONTRIBUTING.md$ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)    new file:   README    modified:   CONTRIBUTING.mdChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)    modified:   CONTRIBUTING.md
    • 現在 CONTRIBUTING.md 檔案同時出現在暫存區和非暫存區。這怎麼可能呢?實際上 Git 只不過暫存了你運行 git add 命令時的版本,如果你現在提交,CONTRIBUTING.md 的版本是你最後一次運行 git add 命令時的那個版本,而不是你運行 git commit 時,在工作目錄中的目前的版本。所以,運行了 git add 之後又作了修訂的檔案,需要重新運行 git add 把最新版本重新暫存起來。

      # git add [檔案名稱]$ git add CONTRIBUTING.md$ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)    new file:   README    modified:   CONTRIBUTING.md
5、忽略檔案
  • 一般我們總會有些檔案無需納入 Git 的管理,也不希望它們總出現在未追蹤檔案列表。通常都是些自動產生的檔案,比如記錄檔,或者編譯過程中建立的臨時檔案等。在這種情況下,我們可以建立一個名為 .gitignore 的檔案,列出要忽略的檔案模式。

    # 顯示 cat .gitignore 檔案內容$ cat .gitignore
    *.[oa]*~
    • 第一行告訴 Git 忽略所有以 .o 或 .a 結尾的檔案。一般這類對象檔案和封存檔案都是編譯過程中出現的。
    • 第二行告訴 Git 忽略所有以波浪符(~)結尾的檔案,許多文本編輯軟體(比如 Emacs)都用這樣的檔案名稱儲存副本。
    • 此外,你可能還需要忽略 log,tmp 或者 pid 目錄,以及自動產生的文檔等等。要養成一開始就設定好 .gitignore 檔案的習慣,以免將來誤提交這類無用的檔案。
  • 檔案 .gitignore 的格式規範如下

    • 所有空行或者以 # 開頭的行都會被 Git 忽略。
    • 可以使用標準的 glob 模式比對。
    • 匹配模式可以以(/)開頭防止遞迴。
    • 匹配模式可以以(/)結尾指定目錄。
    • 要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎號(!)取反。
  • 所謂的 glob 模式是指 shell 所使用的簡化了的Regex。

    • 星號(*)匹配零個或多個任一字元;
    • [abc] 匹配任何一個列在方括弧中的字元(這個例子要麼匹配一個 a,要麼匹配一個 b,要麼匹配一個 c);
    • 問號(?)只匹配一個任一字元;
    • 如果在方括弧中使用短劃線分隔兩個字元,表示所有在這兩個字元範圍內的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的數字)。
    • 使用兩個星號(*) 表示匹配任意中間目錄,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。
  • 我們再看一個 .gitignore 檔案的例子

    # no .a files*.a# but do track lib.a, even though you're ignoring .a files above!lib.a# only ignore the TODO file in the current directory, not subdir/TODO/TODO# ignore all files in the build/ directorybuild/# ignore doc/notes.txt, but not doc/server/arch.txtdoc/*.txt# ignore all .pdf files in the doc/ directorydoc/**/*.pdf
  • GitHub 有一個十分詳細的針對數十種項目及語言的 .gitignore 檔案清單。

6、查看已暫存和未暫存的修改
  • 如果 git status 命令的輸出對於你來說過於模糊,你想知道具體修改了什麼地方,可以用 git diff 命令,git diff 將通過檔案補丁的格式顯示具體哪些行發生了改變。

  • 假如再次修改 README 檔案後暫存,然後編輯 CONTRIBUTING.md 檔案後先不暫存, 運行 status 命令將會看到。

    $ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)    modified:   READMEChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)    modified:   CONTRIBUTING.md
  • 要查看尚未暫存的檔案更新了哪些部分,不加參數直接輸入 git diff。此命令比較的是工作目錄中當前檔案和暫存地區快照之間的差異,也就是修改之後還沒有暫存起來的變化內容。

    $ git diff
    diff --git a/CONTRIBUTING.md b/CONTRIBUTING.mdindex 8ebb991..643e24f 100644--- a/CONTRIBUTING.md+++ b/CONTRIBUTING.md@@ -65,7 +65,8 @@ branch directly, things can get messy. Please include a nice description of your changes when you submit your PR; if we have to read the whole diff to figure out why you're contributing in the first place, you're less likely to get feedback and have your change-merged in.+merged in. Also, split your changes into comprehensive chunks if your patch is+longer than a dozen lines. If you are starting to work on a particular area, feel free to submit a PR that highlights your work in progress (and note in the PR title that it's
  • 若要查看已暫存的將要添加到下次提交裡的內容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本還允許使用 git diff --staged,效果是相同的,但更好記些。)

    $ git diff --staged或$ git diff --cached
    diff --git a/README b/READMEnew file mode 100644index 0000000..03902a1--- /dev/null+++ b/README@@ -0,0 +1 @@+My Project
7、提交更新
  • 每次準備提交前,先用 git status 看下,是不是都已暫存起來了,然後再運行提交命令 git commit

    $ git commit
    • 這種方式會啟動文字編輯器以便輸入本次提交的說明。(預設會啟用 shell 的環境變數 $EDITOR 所指定的軟體,一般都是 vim 或 emacs。)

    • 編輯器會顯示類似下面的文本資訊。

      # Please enter the commit message for your changes. Lines starting# with '#' will be ignored, and an empty message aborts the commit.# On branch master# Changes to be committed:#         new file:   README#         modified:   CONTRIBUTING.md#~~~".git/COMMIT_EDITMSG" 9L, 283C
    • 可以看到,預設的提交訊息包含最後一次運行 git status 的輸出,放在注釋行裡,另外開頭還有一空行,供你輸入提交說明。你完全可以去掉這些注釋行,不過留著也沒關係,多少能幫你回想起這次更新的內容有哪些。 (如果想要更詳細的對修改了哪些內容的提示,可以用 -v 選項,這會將你所做的改變的 diff 輸出放到編輯器中從而使你知道本次提交具體做了哪些修改。)退出編輯器時,Git 會丟掉注釋行,用你輸入提交附帶資訊產生一次提交。

  • 另外,你也可以在 commit 命令後添加 -m 選項,將提交資訊與命令放在同一行。

    # git commit -m [提交內容說明]$ git commit -m "Story 182: Fix benchmarks for speed"
    [master 463dc4f] Story 182: Fix benchmarks for speed 2 files changed, 2 insertions(+) create mode 100644 README    
    • 可以看到,提交後它會告訴你,當前是在哪個分支(master)提交的,本次提交的完整 SHA-1 校正和是什麼(463dc4f),以及在本次提交中,有多少檔案修訂過,多少行添加和刪改過。
8、跳過使用暫存地區
  • 儘管使用暫存地區的方式可以精心準備要提交的細節,但有時候這麼做略顯繁瑣。Git 提供了一個跳過使用暫存地區的方式,只要在提交的時候,給 git commit 加上 -a 選項,Git 就會自動把所有已經跟蹤過的檔案暫存起來一併提交,從而跳過 git add 步驟。

    # git commit -a -m [提交內容說明]$ git commit -a -m 'added new benchmarks'
    [master 83e38c7] added new benchmarks 1 file changed, 5 insertions(+), 0 deletions(-)
9、移除檔案
  • 1)徹底刪除檔案

    • 要從 Git 中移除某個檔案,就必須要從已追蹤檔案清單中移除(確切地說,是從暫存地區移除),然後提交。

    • 1> 可以用 git rm 命令完成此項工作,並連帶從工作目錄中刪除指定的檔案,這樣以後就不會出現在未追蹤檔案清單中了。

      # git rm [檔案名稱]$ git rm PROJECTS.md
      • git rm 命令後面可以列出檔案或者目錄的名字,也可以使用 glob 模式。

        $ git rm log/\*.log
      • 注意到星號 * 之前的反斜線 , 因為 Git 有它自己的檔案模式擴充匹配方式,所以我們不用 shell 來幫忙展開。此命令刪除 log/ 目錄下副檔名為 .log 的所有檔案。

      • 類似的比如

        $ git rm \*~
      • 該命令為刪除以 ~ 結尾的所有檔案。

    • 2> 如果只是簡單地從工作目錄中手工刪除檔案,運行 git status 時就會在 “Changes not staged for commit” 部分(也就是 未暫存清單)看到:

      $ rm PROJECTS.md
      $ git statusOn branch masterYour branch is up-to-date with 'origin/master'.Changes not staged for commit:  (use "git add/rm <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)        deleted:    PROJECTS.mdno changes added to commit (use "git add" and/or "git commit -a")
      • 然後再運行 git rm 記錄此次移除檔案的操作。

        # git rm [檔案名稱]$ git rm PROJECTS.md
        rm 'PROJECTS.md'
        $ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)  deleted:    PROJECTS.md
    • 如果刪除之前修改過並且已經放到暫存地區的話,則必須要用強制移除選項 -f(譯註:即 force 的首字母)。這是一種安全特性,用於防止誤刪還沒有添加到快照的資料,這樣的資料不能被 Git 恢複。

  • 2)從 Git 倉庫中移除檔案

    • 另外一種情況是,我們想把檔案從 Git 倉庫中刪除(亦即從暫存地區移除),但仍然希望保留在當前工作目錄中。換句話說,你想讓檔案保留在磁碟,但是並不想讓 Git 繼續跟蹤。當你忘記添加 .gitignore 檔案,不小心把一個很大的記錄檔或一堆 .a 這樣的編譯組建檔案添加到暫存區時,這一做法尤其有用。為達到這一目的,使用 --cached 選項。

      # git rm --cached [檔案名稱]$ git rm --cached README
10、重新命名檔案
  • 不像其它的 VCS 系統,Git 並不顯式追蹤檔案移動操作。如果在 Git 中重新命名了某個檔案,倉庫中儲存的中繼資料並不會體現出這是一次改名操作。

  • 要在 Git 中對檔案改名,可以這麼做。

    # git mv [檔案名稱] [新檔案名稱]$ git mv README.md README
    • 此時查看狀態資訊,也會明白無誤地看到關於重新命名操作的說明。

      $ git statusOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)    renamed:    README.md -> README
    • 其實,運行 git mv 就相當於運行了下面三條命令。

      $ mv README.md README$ git rm README.md$ git add README

iOS - 提交更新到倉庫(分布式版本控制系統)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.