標籤:

git文件狀態,暫存與提交

從現有目錄中創建git倉庫 git init

git倉庫(repository),也叫做版本庫。使用git的目的是管理項目,並且保存一些隨時間變化的文件。git使用git倉庫來保存這些信息。

git倉庫作為一個目錄保存在項目目錄中,目錄名為 .git。作為一種分散式版本控制工具,git倉庫中包含了項目的所有被記錄信息。

在目錄中,使用 $ git init 命令創建git倉庫。

下面的例子在 /home/wm/project/wm_git_book/ 目錄下創建了git倉庫,即項目目錄 wm_git_book 開始由git進行版本控制。

$ git initInitialized empty git repository in /home/wm/project/wm_git_book/.git/

命令後的提示說明在指定位置創建了一個空倉庫。現在 wm_git_book 目錄中有了一個 .git 目錄,這就是git倉庫。

使用同樣的命令也可以在已經存在文件的目錄中創建倉庫。

文件的狀態:跟蹤與未跟蹤、文件狀態變化情況

被git管理的工作目錄中的文件無非兩種狀態:已跟蹤或者未跟蹤。

已跟蹤的文件是指那些被git管理的文件,在上一次快照中有他們的記錄。已跟蹤的文件可的狀態能是未修改的、已修改的或者已暫存的。

工作目錄中除了已跟蹤的文件,其餘全是未跟蹤的文件。

初次克隆某個倉庫的時候,工作目錄中所有文件都是已跟蹤未修改狀態。修改了某些文件後,進行暫存和提交,如此反覆。

使用git時文件狀態變化情況如下:

查看狀態 git status

如果要查看文件的狀態,可以使用 git status 命令。

$ git statusOn branch masterInitial commitnothing to commit (create/copy files and use "git add" to track)

git告訴我們,目前在 master 分支,或者說主分支。主分支是每一個使用git管理的項目的默認分支。

git還告訴我們,目前沒有要提交的內容,並且提示我們用 git add 將文件進行跟蹤。

現在我們來創建一個 README.txt 文件,內容如下:

Hi, git!

現在用 git status 查看一下狀態:

$ git statusOn branch masterInitial commitUntracked files: (use "git add <file>..." to include in what will be committed) README.txtnothing added to commit but untracked files present (use "git add" to track)

git告訴我們,工作區中有一個修改的文件 README.txt,它是未跟蹤文件。git 不會 自動跟蹤文件,跟蹤新的文件需要手動操作,這樣可以避免二進位或者其他不想跟蹤的文件被跟蹤。

暫存與提交 git add, git commit [-ma]

使用 git add 跟蹤一個文件,並且將其納入暫存區。git add使用文件或者目錄作為參數,如果參數是目錄,那麼會遞歸地跟蹤該目錄下左右文件。下面將跟蹤 README.txt 文件:

$ git add README.txt

沒有提示就是好提示。再次使用 git status 查看狀態:

$ git statusOn branch masterInitial commitChanges to be committed: (use "git rm --cached <file>..." to unstage) new file: README.txt

可見,此時 README.txt 已經被暫存(staged),並且作為下次提交(commit)的新文件。

使用 git commit 對暫存的文件進行提交,提交之後文件就會被保存在git倉庫中。使用前請確定所有需要提交的文件都已經 git add 過,使用方法如下:

$ git commit -m "Add README.txt"[master (root-commit) bf47a4f] Add README.txt 1 file changed, 1 insertion(+) create mode 100644 README.txt

git commit-m選項讓用戶將提交命令和信息在一行寫完。上面的Add README.txt是用戶對本次提交的說明,即提交信息。提交內容是暫存區的內容,提交後,系統會顯示本次提交的分支(master)、完整SHA-1校驗和(bf47a4f)以及文件的更改。

提交的文件是已經添加到暫存區的文件快照,在工作目錄中未添加到暫存區的文件不會被提交。已經添加到暫存區的文件,但是在工作目錄中被修改,而沒有再次添加到暫存區,提交的是暫存區中的文件快照。

如果確實有很多提交信息要寫,可以直接使用git commit命令,執行命令後,結果如下:

# 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: b.txt#

其中第一行是填寫提交信息的地方,所有已#開頭的行都是注釋,可以刪除掉,也可以保留。默認注釋行寫了分支和文件情況。使用git config --global core.editor來設置你喜歡的編輯軟體。

暫存區可以讓用戶精心的準備需要提交的文件,但是有時候也會略微繁瑣。如果不想通過暫存區而直接提交,可以使用git commit -a命令。這個命令可以將所以已經跟蹤過的文件暫存起來一併提交,而不用git add。已經跟蹤的文件是指該文件被git管理,表現為暫存區或者git倉庫中有該文件的快照。

現在修改README.txt的內容,在文件末尾添加一行git is a free and open source distributed version control system.,然後使用-a選項提交。

$ cat README.txt Hi, git!git is a free and open source distributed version control system.$ git statusOn branch masterChanges 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: README.txtno changes added to commit (use "git add" and/or "git commit -a")$ git commit -a -m "Add a description to git in README.txt"[master 8307318] Add a description to git in README.txt 1 file changed, 1 insertion(+)$ git statusOn branch masternothing to commit, working directory clean

可以看到,README.txt作為一個已經被跟蹤的文件,在修改後不使用git add添加到暫存區,而直接使用git commit -a就可以提交。

暫存已修改的文件、狀態簡覽 git status -s

現在在README.txt末尾補充一句:git is very easy to learn.。並且把它加到暫存區。

$ cat README.txt Hi, git!git is a free and open source distributed version control system.git is very easy to learn.$ git status On branch masterChanges 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: README.txtno changes added to commit (use "git add" and/or "git commit -a")$ git add README.txt $ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage)wenjain modified: README.txt

README.txt是被跟蹤的文件,在修改之後,它的狀態是:已經修改,還沒有暫存。然後將它添加到暫存區。可見,git add既可以用來跟蹤新的文件,亦可以將已經跟蹤的文件添加到暫存區。git add的作用是將文件添加到暫存區,暫存區是下一次提交的文件,因此git add也可以理解為將此文件作為下次提交的文件。

再次修改README.txt,在其末尾添加git is very fast.。再次查看狀態。

$ cat README.txt Hi, git!git is a free and open source distributed version control system.git is very easy to learn.git is very fast.$ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.txtChanges 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: README.txt

出現了兩個README.txt,其中一個是待提交(在暫存區),一個是未暫存(在工作目錄)。這個現象的原因是git暫存區只保存了文件在執行git add時的版本,如果此時提交,則只會提交文件被最後一次git add時的快照,而不是在工作目錄中的當前版本。

現在運行git status -s可以得到下面的結果:

$ git status -sMM README.txt

git status -s會顯示簡單的狀態,在上面的例子中README.txt的左邊的M表示該文件被修改了並且已經放入了暫存區,右邊的M表示被修改了但是還沒有放入暫存區。下面是一個輸出樣本:

$ git status -s MM README.txt M makefile A xxx.txtM aaa.c ?? LICENSE.txt

README.txt在修改後添加到暫存區,又被修改之後未加入暫存區。makefile被修改了但未加入暫存區。A標記的xxx.txt表示該文件是第一次被加入到暫存區。aaa.c被修改後加入暫存區,並且未再次被修改。??標記的LICENSE.txt表示該文件未被跟蹤。


推薦閱讀:

Visual Studio Code 使用Git進行版本控制
Git算不算程序員的必備技能?
用 Git 一定要用命令行嗎?用命令行一定高貴嗎?
Git常用命令詳解

TAG:Git |