完全掌握git(一)html
① 工做區
所謂工做區,就是你在電腦裏能看到的目錄,能夠簡單地理解爲咱們的項目根目錄就是工做區。
② 版本庫
所謂版本庫,就是在項目根目錄下執行git init
命令以後,會在項目根目錄下生成一個.git目錄,正常狀況下,這個.git目錄是隱藏的,這個.git目錄就是版本庫。
③ 暫存區
所謂暫存區,就是.git版本庫目錄中存放的index文件,因此咱們也會把暫存區叫做索引(index)區。git
因此,完成一次提交包括三個步驟,首先對工做區中的內容進行修改,而後經過add命令將工做區的修改歸入到暫存區中,最後將暫存區的修改經過commit命令提交到版本庫中。
segmentfault
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
① git diff
: 不帶任何參數的git diff
命令,是比較工做區和暫存區的差異。好比,工做區中某個文件發生了修改,可是還未添加到暫存區中,此時工做區和暫存區是有差異的,經過git diff
命令便可查看到工做區的修改內容。
② git diff --cached
: 帶上了--cached參數,此時同git diff --staged
,比較的是暫存區和最後一次提交的差異。好比,工做區內容修改後,同時將工做區的修改添加到了暫存區中,那麼此時,暫存區和最新一次提交是有差異的,由於目前最新一次提交是上次的提交。
③ git diff head
: head表示的最後一次提交(最新的提交),是比較(工做區和暫存區)與最後一次提交的差異,便可以同時查看工做區、暫存區與最後一次提交的區別。htm
① 取消工做區的修改: 若是對工做區的內容進行了修改,可是該修改尚未添加到暫存區,那麼能夠經過git checkout -- <file>
的方式來取消工做區的修改。
② 取消暫存區的修改: 若是對工做區的內容進行了修改,同時該修改已經添加到了暫存區,那麼能夠經過reset命令來重置暫存區,由於工做區的修改提交到了暫存區,如今暫存區和最後一次提交出現了差異,因此咱們能夠將暫存區重置到head位置,即最後一次提交的位置,便可恢復暫存區,即git reset head <file>
,head後面不加文件名則表示重置暫存區中的全部文件。
③ 回退到某個版本: 若是通過一系列操做後,想要回到某個版本,那麼能夠經過git reset --hard <commit-id>
回到指定的提交位置。不加--hard,也能夠回到指定的提交位置,可是不會清空工做區的修改,只會清空暫存區的修改,而加上--hard則表示徹底回到指定的提交位置。blog
對應項目中的一些文件,咱們可能不想被版本庫追蹤。咱們能夠在項目根目錄下新建一個.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
當咱們在某些事情進行到中間的時候,忽然發現須要先快速修復某個問題,可是咱們又不想丟棄以前的工做,那麼咱們能夠經過 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}