1. 程式人生 > >git: 記錄每次更新到倉庫學習筆記

git: 記錄每次更新到倉庫學習筆記

文件標記 管理 有偏 讓我 再看 路徑 for reset tor

請記住,你工作目錄下的每一個文件都不外乎這兩種狀態:已跟蹤或未跟蹤。 已跟蹤的文件是指那些被納入了版本控制的文件,在上一次快照中有它們的記錄,在工作一段時間後,它們的狀態可能處於未修改,已修改或已放入暫存區。 工作目錄中除已跟蹤文件以外的所有其它文件都屬於未跟蹤文件,它們既不存在於上次快照的記錄中,也沒有放入暫存區。 初次克隆某個倉庫的時候,工作目錄中的所有文件都屬於已跟蹤文件,並處於未修改狀態。

關鍵詞

  • Changes to be committed 已放到暫存區待提交
  • Changes not staged for commit 已跟蹤文件的內容發生了變化,但還沒有放到暫存區

檢查當前文件狀態

要查看哪些文件處於什麽狀態,可以用 git status 命令。 如果在克隆倉庫後立即使用此命令,會看到類似這樣的輸出:

$ git status
On branch master
nothing to commit, working directory clean

這說明你現在的工作目錄相當幹凈。換句話說,所有已跟蹤文件在上次提交後都未被更改過。 此外,上面的信息還表明,當前目錄下沒有出現任何處於未跟蹤狀態的新文件,否則 Git 會在這裏列出來。 最後,該命令還顯示了當前所在分支,並告訴你這個分支同遠程服務器上對應的分支沒有偏離。 現在,分支名是 “master”,這是默認的分支名。 我們在 Git 分支 會詳細討論分支和引用。

現在,讓我們在項目下創建一個新的 README 文件。 如果之前並不存在這個文件,使用 git status 命令,你將看到一個新的未跟蹤文件:

$ echo 'My Project' > README
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

在狀態報告中可以看到新建的 README 文件出現在 Untracked files 下面。 未跟蹤的文件意味著 Git 在之前的快照(提交)中沒有這些文件;Git 不會自動將之納入跟蹤範圍,除非你明明白白地告訴它“我需要跟蹤該文件”, 這樣的處理讓你不必擔心將生成的二進制文件或其它不想被跟蹤的文件包含進來。 不過現在的例子中,我們確實想要跟蹤管理 README 這個文件。

跟蹤新文件

使用命令 git add 開始跟蹤一個文件。 所以,要跟蹤 README 文件,運行:

$ git add README

此時再運行 git status 命令,會看到 README 文件已被跟蹤,並處於暫存狀態:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

只要在 Changes to be committed 這行下面的,就說明是已暫存狀態。 如果此時提交,那麽該文件此時此刻的版本將被留存在歷史記錄中。 你可能會想起之前我們使用 git init 後就運行了 git add (files) 命令,開始跟蹤當前目錄下的文件。 git add 命令使用文件或目錄的路徑作為參數;如果參數是目錄的路徑,該命令將遞歸地跟蹤該目錄下的所有文件。

暫存已修改文件

現在我們來修改一個已被跟蹤的文件。 如果你修改了一個名為 CONTRIBUTING.md 的已被跟蹤的文件,然後運行 git status 命令,會看到下面內容:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

Changes 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 將"CONTRIBUTING.md"放到暫存區,然後再看看 git status 的輸出:

$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

現在兩個文件都已暫存,下次提交時就會一並記錄到倉庫。 假設此時,你想要在 CONTRIBUTING.md 裏再加條註釋, 重新編輯存盤後,準備好提交。 不過且慢,再運行 git status 看看:

$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

Changes 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 status 命令的輸出十分詳細,但其用語有些繁瑣。 如果你使用 git status -s 命令或 git status --short 命令,你將得到一種更為緊湊的格式輸出。 運行 git status -s ,狀態報告輸出如下:

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

新添加的未跟蹤文件前面有 ?? 標記,新添加到暫存區中的文件前面有 A 標記,修改過的文件前面有 M 標記。 你可能註意到了 M 有兩個可以出現的位置,出現在右邊的 M 表示該文件被修改了但是還沒放入暫存區,出現在靠左邊的 M 表示該文件被修改了並放入了暫存區。 例如,上面的狀態報告顯示: README 文件在工作區被修改了但是還沒有將修改後的文件放入暫存區,lib/simplegit.rb 文件被修改了並將修改後的文件放入了暫存區。 而 Rakefile 在工作區被修改並提交到暫存區後又在工作區中被修改了,所以在暫存區和工作區都有該文件被修改了的記錄。

git: 記錄每次更新到倉庫學習筆記