github review <1>
github review 系列主要是因爲要向github提交leetcode代碼,但是之前看的《git權威指南》因爲好久沒用所以給擱置了,撿起來review一下O(∩_∩)O哈!
common comand:
- git add
- git ci -m ‘description’
- git st -s -s是short的意思
- git log –oneline –graph
- git diff 工作區和暫存區(stage)的差異
.git/index 實際上就是一個包含文件索引的目錄樹,像是一個虛擬的工作去。文件的內容保存在.git/objects對象庫目錄中。
工作區、版本庫、暫存區原理圖
- 上圖左側爲工作區,右側爲版本庫。在版本庫中標記爲index的爲暫存區,標記爲master的是master分支所代表的目錄樹。
- 對工作區的修改執行git add時,暫存區的目錄樹會更新,同時文件內容會被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
- git commit命令時,暫存區的目錄樹會寫入到版本庫中。master分支會相應的更新。即master最新指向的目錄樹就是提交時原暫存區的目錄樹。
- git reset HEAD,暫存區的目錄樹會被重寫,會被master分支所指向的目錄樹所替換,但是工作區不受影響。
- git rm –cache < file> 的時候,會從暫存區刪除文件,工作區不受影響。
- git checkout . 或者 git checkout – < file> 的時候,會用暫存區全部的文件或者指定的文件替換工作區的文件。這個操作很危險,會清除工作區未添加到暫存區的改動。
- git checkout HEAD . 或者 git checkout HEAD < file>命令時,會用HEAD指向的master分支中的全部或者部分文件替換暫存區和工作區中的文件。
git diff 命令
- 比較工作區和暫存區 git diff
- 比較暫存區和HEAD git diff –cache
- 工作區和HEAD比較 git diff HEAD
對象庫
git cat-file
-t參數 後面跟對象id 顯示類型
-p參數 顯示對象詳細信息
git rev-parse master
顯示對象ID
分支的實現:
master爲例,master分支在版本庫的引用目錄中 (.git/refs)體現爲一個引用文件.git/refs/heads/master,起內容就是分支中最新提交的提交ID
git reset重置
用法一:git reset [-q] [< commit>] [–] < paths>… 爲了避免路徑和引用(或提交ID)同名而發生衝突,可以在< paths>前用–作爲分隔
用法二:git reset [–soft | –mixed | –hard | –merge | –keep] [-q] [< commit>]
git reset省略commit就是默認HEAD。
- 第一種用法不會重置引用,更不會更改工作區,只是用指定commit下的文件替換掉暫存區中的文件。用法舉例:
git reset HEAD < paths>取消之前執行的git add < paths>命令時改變的暫存區。 - 第二種用法則會重置引用(master引用)。
- 參數–hard
- 改變master(或者其他分支)引用
- 用commit指向的目錄樹替換暫存區
- 替換工作區,使得和暫存區一樣
- 參數–soft
只改變當前分支的引用 - 參數–mixed(默認參數)
- 改變當前分支的引用
- 改變暫存區,不改變工作區
- 參數–hard
實例:
- git reset
用HEAD指向目錄樹重置暫存區。 - git reset HEAD
同上 - git reset – filename
文件filename的改動撤出暫存區,其它文件不變。 - git reset HEAD filename
同上 - git reset –soft HEAD^
撤銷最近的提交以便重新提交。
重置反悔
- git reset –hard HEAD^
重置到HEAD的父提交 - git reflog show master | head -5
輸出中,這裏< refname>@{< n>}含義是引用< rfname>之前第< n>次改變時的SHA1哈希值。
用來挽救錯誤的重置
接着命令是 - git reset –hard master@{2}
git checkout檢出
git merge commitID 會將commit合併到當前分支中。
用法一:git checkout [-q] [\] [–] < paths>… 爲避免路徑和引用(或提交ID)同名而發生衝突,可以在< paths>前用–作爲分隔
此用法不會改變HEAD頭指針,主要用於指定版本的文件覆蓋工作區中對應的文件。若省略< commit>,則會用暫存區的文件覆蓋工作區的文件,否則用指定提交中的文件覆蓋暫存區和工作區中對應的文件。
用法二:git checkout [< branch>]
此用法會改變HEAD頭指針,之所以後面的參數寫作< branch>,是因爲只有HEAD切換到一個分支纔可以對提交進行跟蹤,否則仍然會進入“分離頭指針”的狀態,此狀態下提交不能被引用關聯到,從而可能丟失。所以此用法最主要的作用就是切換到分支,若省略則相當於對工作區進行狀態檢查。
用法三:git checkout [-m] [[-b | orphan] < new_branch>] [< start_point>]
此用法主要是創建和切換到新的分支,新的分支從< start_point>指定的提交開始創建。新分支與master分支沒什麼實質的不同,都是在refs/heads命名空間下的引用。
用法舉例
- git checkout branch
更新HEAD指向branch分支,並用branch指向的 - git checkout
彙總顯示工作區、暫存區和HEAD的差異。 - git checkout HEAD
同上 - git checkout – filename
用暫存區的filename來覆蓋工作區的filename。 - git checkout branch –filename
HEAD不變,用branch指向的提交中的filename替換暫存區和工作區中的文件。 - git checkout – .或者git checkout .
會取消所有本地的修改(相對暫存區)相當於用暫存區覆蓋工作區。