github review

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對象庫目錄中。


工作區、版本庫、暫存區原理圖

工作區、版本庫、暫存區原理圖

  1. 上圖左側爲工作區,右側爲版本庫。在版本庫中標記爲index的爲暫存區,標記爲master的是master分支所代表的目錄樹。
  2. 對工作區的修改執行git add時,暫存區的目錄樹會更新,同時文件內容會被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
  3. git commit命令時,暫存區的目錄樹會寫入版本庫中。master分支會相應的更新。即master最新指向的目錄樹就是提交時原暫存區的目錄樹。
  4. git reset HEAD暫存區的目錄樹會被重寫,會被master分支所指向的目錄樹所替換,但是工作區不受影響。
  5. git rm –cache < file> 的時候,會從暫存區刪除文件,工作區不受影響。
  6. git checkout . 或者 git checkout – < file> 的時候,會用暫存區全部的文件或者指定的文件替換工作區的文件。這個操作很危險,會清除工作區未添加到暫存區的改動。
  7. git checkout HEAD . 或者 git checkout HEAD < file>命令時,會用HEAD指向的master分支中的全部或者部分文件替換暫存區工作區中的文件。
git diff 命令
  1. 比較工作區和暫存區 git diff
  2. 比較暫存區和HEAD git diff –cache
  3. 工作區和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。

  1. 第一種用法不會重置引用,更不會更改工作區,只是用指定commit下的文件替換掉暫存區中的文件。用法舉例:
    git reset HEAD < paths>取消之前執行的git add < paths>命令時改變的暫存區。
  2. 第二種用法則會重置引用(master引用)。
    • 參數–hard
      1. 改變master(或者其他分支)引用
      2. 用commit指向的目錄樹替換暫存區
      3. 替換工作區,使得和暫存區一樣
    • 參數–soft
      只改變當前分支的引用
    • 參數–mixed(默認參數)
      1. 改變當前分支的引用
      2. 改變暫存區,不改變工作區

實例:

  • git reset
    用HEAD指向目錄樹重置暫存區。
  • git reset HEAD
    同上
  • git reset – filename
    文件filename的改動撤出暫存區,其它文件不變。
  • git reset HEAD filename
    同上
  • git reset –soft HEAD^
    撤銷最近的提交以便重新提交。
重置反悔
  1. git reset –hard HEAD^
    重置到HEAD的父提交
  2. git reflog show master | head -5
    輸出中,這裏< refname>@{< n>}含義是引用< rfname>之前第< n>次改變時的SHA1哈希值。
    用來挽救錯誤的重置
    接着命令是
  3. 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 .
    會取消所有本地的修改(相對暫存區)相當於用暫存區覆蓋工作區。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章