完全掌握git(二)

1、前情回顧

完全掌握git(一)html

2、基本概念

① 工做區
所謂工做區,就是你在電腦裏能看到的目錄,能夠簡單地理解爲咱們的項目根目錄就是工做區。
② 版本庫
所謂版本庫,就是在項目根目錄下執行git init命令以後,會在項目根目錄下生成一個.git目錄,正常狀況下,這個.git目錄是隱藏的,這個.git目錄就是版本庫
③ 暫存區
所謂暫存區,就是.git版本庫目錄中存放的index文件,因此咱們也會把暫存區叫做索引(index)區git

因此,完成一次提交包括三個步驟,首先對工做區中的內容進行修改,而後經過add命令將工做區的修改歸入到暫存區中,最後將暫存區的修改經過commit命令提交到版本庫中
1352126739_7909.jpgsegmentfault

3、status命令

git status命令用於查看當前工做區中所發生的修改,以及其中哪些修改已經添加到了暫存區中,簡單說,就是status命令能夠查看工做區中有哪些文件尚未被追蹤哪些被追蹤的文件被修改後有沒有被添加到暫存區(當前在工做區仍是在暫存區)spa

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

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:  index.html 

Untracked files:

 (use "git add <file>..." to include in what will be committed)

bar.txt

能夠看到,bar.txt是新添加的文件,尚未被git追蹤;index.html是已經被追蹤的文件,在工做區中修改後尚未提交到暫存區;foo.txt是在工做區中修改後同時將修改添加到了暫存區中。code

4、diff命令

git diff: 不帶任何參數的git diff命令,是比較工做區和暫存區的差異。好比,工做區中某個文件發生了修改,可是還未添加到暫存區中,此時工做區和暫存區是有差異的,經過git diff命令便可查看到工做區的修改內容。
git diff --cached: 帶上了--cached參數,此時同git diff --staged,比較的是暫存區和最後一次提交的差異。好比,工做區內容修改後,同時將工做區的修改添加到了暫存區中,那麼此時,暫存區和最新一次提交是有差異的,由於目前最新一次提交是上次的提交。
git diff head: head表示的最後一次提交(最新的提交),是比較(工做區和暫存區)與最後一次提交的差異,便可以同時查看工做區、暫存區與最後一次提交的區別。htm

5、回退修改

① 取消工做區的修改: 若是對工做區的內容進行了修改,可是該修改尚未添加到暫存區,那麼能夠經過git checkout -- <file>的方式來取消工做區的修改。
② 取消暫存區的修改: 若是對工做區的內容進行了修改,同時該修改已經添加到了暫存區,那麼能夠經過reset命令來重置暫存區,由於工做區的修改提交到了暫存區,如今暫存區和最後一次提交出現了差異,因此咱們能夠將暫存區重置到head位置,即最後一次提交的位置,便可恢復暫存區,即git reset head <file>,head後面不加文件名則表示重置暫存區中的全部文件。
③ 回退到某個版本: 若是通過一系列操做後,想要回到某個版本,那麼能夠經過git reset --hard <commit-id>回到指定的提交位置。不加--hard,也能夠回到指定的提交位置,可是不會清空工做區的修改,只會清空暫存區的修改,而加上--hard則表示徹底回到指定的提交位置。blog

6、.gitignore文件

對應項目中的一些文件,咱們可能不想被版本庫追蹤。咱們能夠在項目根目錄下新建一個.gitignore文件,而後將不須要被版本庫追蹤的文件添加到.gitignore文件中。須要注意的是,.gitignore文件只能忽略還未被版本庫追蹤的文件。對於已經被版本庫追蹤的文件,若是也想忽略,怎麼辦呢?已經被版本庫追蹤的文件之因此不能被忽略,是由於該文件在暫存區中,因此若是咱們把該文件從暫存區中刪除不就能夠了嗎。索引

> git rm --cached <file>

> git add <file>

> git commit --message 'untrack some file'

不過,該方法有一個很差的地方就是從暫存區中刪除後,須要提交一次。咱們還能夠經過 git update-index --assume-unchanged <file> 那麼該文件就不會被版本庫追蹤了,也不須要將其加到.gitignore文件中。若是想恢復,那麼能夠執行git update-index --no-assume-unchanged <file>get

7、stash命令

當咱們在某些事情進行到中間的時候,忽然發現須要先快速修復某個問題,可是咱們又不想丟棄以前的工做,那麼咱們能夠經過 git stash命令將這些工做區和暫存區的修改都保存到本地。執行git stash命令後,工做區和暫存區當即變乾淨了,此時能夠着手一些更緊急的bug,等bug修復後,再以前的工做恢復出來,能夠經過 git stash pop將棧頂的stash恢復。也能夠經過git stash list查看全部的stash,而後恢復指定的stash,如:it

> git stash
Saved working directory and index state WIP on master: 3f5aa1b add bar.txt

> git stash list
stash@{0}: WIP on master: 3f5aa1b add bar.txt

> git stash pop stash@{0}
相關文章
相關標籤/搜索