Git之重置
阿新 • • 發佈:2019-01-08
一、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
- cat .git/refs/heads/master 檢視master分支的引用檔案內容
二、git reflog挽救錯誤重置
git提供一個挽救機制,通過.git/logs目錄下日誌檔案記錄了分支的變更。預設非裸版本庫(存在工作區)均提供分支日誌功能,因為帶有工作區的版本庫有如下設定:git config core.logallrefupdates 。
- git reflog show master | head -5
- git reset --hard
- 後者最新改變的資訊放在末尾;
- 前者最新改變的資訊放在最前,只顯示每次改變的最終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所指向的目錄樹內容相同。
- 替換引用的指向:引用指向新的提交ID。即只更改引用的指向,不改變暫存區和工作區。
- 替換引用的指向:引用指向新的提交ID。
- 替換暫存區:暫存區的內容和引用指向的目錄樹一致。
- 即更改引用的指向及重置暫存區,但是不改變工作區。
- 僅用HEAD指向的目錄樹重置暫存區,工作區不會受到影響=== 將之前用git add命令更新到暫存區的內容撤出暫存區。
- 引用未改變=重置到HEAD
- 僅將檔案filename的改動撤出暫存區,其他檔案不改變=== git add filename的反向操作
- 工作區和暫存區不改變,引用向前回退一次。
- git commit --amend 修補提交命令=== $ git reset --soft HEAD^ $ git commit -e -F .git/COMMIT_EDITMSG
- 工作區不改變,暫存區會回退到上一次提交之前,引用也會回退一次。
- 徹底撤銷最近提交。引用回退到前一次,且工作區和暫存區均回退到上一次提交狀態。
- 自上一次以來的提交全部丟失。