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 |