轉載地址:(http://san-yun.iteye.com/blog/2061647) 1、git的工作區:在當前倉庫中,新增,更改,刪除文件這些動作,都發生在工作區里面。
2、git的暫存區:英文叫stage, 或index。在版本庫.git)目錄下,有一個index文件。它實際上就是一個包含文件索引的目錄樹,像是一個虛擬的工作區。在這個虛擬工作區的目錄樹中,記錄了文件名、文件的狀態信息(時間戳、文件長度等),文件的內容并不存儲其中,而是保存在Git對象庫(.git/objects)中,文件索引建立了文件和對象庫中對象實體之間的對應。如果當前倉庫,有文件更新,并且使用git add 命令,那么這些更新就會出現在暫存區中。
3、版本庫:當前倉庫下,如果沒有任何的提交,那么版本庫就是對應上次提交后的內容。 版本庫與工作區和暫存區的關系: “HEAD” 實際是指向 master 分支的一個“游標”。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。 圖中的 objects 標識的區域為 Git 的對象庫,實際位于 “.git/objects” 目錄下,里面包含了創建的各種對象及內容。
當對工作區修改(或新增)的文件執行 “git add” 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
當執行 “git reset HEAD” 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
當執行 “git rm –cached ” 命令時,會直接從暫存區刪除文件,工作區則不做出改變。
當執行 “git checkout .” 或者 “git checkout – ” 命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。
使用git diff查看各個區之間的差異
使用命令 | 代表意義 |
---|---|
git diff | 比較的是工作區和暫存區的差別 |
git diff –cached | 比較的是暫存區和版本庫的差別 |
git diff HEAD | 可以查看工作區和版本庫的差別 |
每次commit后,git diff –cached沒有內容,是因為暫存區的內容已經更新到版本庫中,因此暫存區和版本庫中的內容無差別
git reset和git revert的區別: reset是重置,默認是git reset –mixed 可以讓版本庫重置到某個commit狀態,該commit之后的commit不會保留,并重置暫存區,但是不改變工作區。即這個時候,上次提交的內容在工作區中還會存在。
如果使用git reset –hard 將版本庫,暫存區和工作區的內容全部重置為某個commit的狀態。之前的commit不會保留。
revert比reset更加溫柔一點,回滾到某次commit且該commit之后的提交記錄都會保留,并且會在此基礎上新建一個提交。對于已經push到服務器上的內容作回滾,推薦使用revert。
新聞熱點
疑難解答