1. 程式人生 > >Git之重置

Git之重置

一、git reset 實現分支重置

    即改變分支引用檔案的內容。master 分支在版本庫的引用目錄.gif/refs中體現為一個引用檔案.git/refs/heads/master,當有新檔案提交時,引用refs/heads/master便指向新的提交。此外,可通過git reset將引用指向任一個存在的提交ID,該引用類似遊標,且可人為更改。

  • git reset --hard HEAD^     將 master重置到上一個老的提交上(HEAD的父提交);--hard引數:破壞工作區未提交的改動,慎用。
  • git reset --hard 47dc5eb   重置到某個提交ID
  • git log --graph --oneline
      (--oneline引數:顯示短小的提交ID;Git 1.6.3前可採用--pretty=oneline --abbrev-commit替代)
  • cat .git/refs/heads/master  檢視master分支的引用檔案內容




二、git reflog挽救錯誤重置

    git提供一個挽救機制,通過.git/logs目錄下日誌檔案記錄了分支的變更。預設非裸版本庫(存在工作區)均提供分支日誌功能,因為帶有工作區的版本庫有如下設定:git config core.logallrefupdates 。

    git reflog 輸出與檢視日誌檔案最大不同之處:
  • 後者最新改變的資訊放在末尾;
  • 前者最新改變的資訊放在最前,只顯示每次改變的最終SHA1雜湊值;此外,提供方便易記表示式:<refname>@{<n>},即引用<refname>之前第<n>次改變時的SHA1雜湊值。


三、git reset詳解

命令:

<commit>:可選項,可使用引用或提交ID,省略則表示使用了HEAD的指向作為提交ID

用法1:git reset [-q] [<commit>] [--] <paths>...

1)包含路徑,避免路徑與引用同名而發生衝突,可在路徑前加兩個連續的短線;
2)不會重置引用,不會改變工作區;
3)用指定提交狀態(<commit>)下的檔案(<paths>)替換掉暫存區中的檔案;
4)如git reset HRAD <paths> === 取消之前執行的git add <paths>命令時改變的暫存區。

用法2:git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
1)不包含路徑的用法會引起重置引用;
2)根據不同選項可對暫存區或工作區進行重置;
3)引數--hard:git reset --hard <commit> ,執行以下步驟

  • 替換引用的指向:引用指向新的提交ID。
  • 替換暫存區:暫存區的內容和引用指向的目錄樹一致。
  • 替換工作區:工作區的內容變得和暫存區一致,也與HEAD所指向的目錄樹內容相同。
4)引數--soft:git reset --soft <commit>,指向以下步驟
  • 替換引用的指向:引用指向新的提交ID。即只更改引用的指向,不改變暫存區和工作區。
5)引數--mixed或不使用引數(預設為--mixed):git reset <commit>,指向以下步驟
  • 替換引用的指向:引用指向新的提交ID。
  • 替換暫存區:暫存區的內容和引用指向的目錄樹一致。
  • 即更改引用的指向及重置暫存區,但是不改變工作區。
6)git reset === git reset HEAD 
  • 僅用HEAD指向的目錄樹重置暫存區,工作區不會受到影響=== 將之前用git add命令更新到暫存區的內容撤出暫存區。
  • 引用未改變=重置到HEAD
7)git reset -- filename === git reset HEAD filename
  • 僅將檔案filename的改動撤出暫存區,其他檔案不改變=== git add filename的反向操作
8)git reset --soft HEAD^ 
  • 工作區和暫存區不改變,引用向前回退一次。
  • git commit --amend 修補提交命令===  $ git reset --soft HEAD^   $ git commit -e -F .git/COMMIT_EDITMSG
9)git reset HEAD^ ===git reset --mixed HEAD^
  • 工作區不改變,暫存區會回退到上一次提交之前,引用也會回退一次。
10)git reset --hard HEAD^
  • 徹底撤銷最近提交。引用回退到前一次,且工作區和暫存區均回退到上一次提交狀態。
  • 自上一次以來的提交全部丟失。