Git reset 的三種模式( soft mixed hard )比較

git reset 的三種主要模式(–soft, –mixed,–hard),一直困擾著我不太確定知不知道其中差異,似懂非懂,最近剛好為公司同事進行 Git 教育訓練,藉機來把觀念釐清

情境

  1. 建立 git repository
  2. 新增 a.txt
  3. 修改 a.txt 並 commit
  4. 修改 a.txt 並新增 b.txt 後 commit

    1_SOURCE

  • 原始檔案狀態

    filelifecycle

測試

2_reset

1. git reset –soft

![3_SOFT](https://trello-attachments.s3.amazonaws.com/583c75c90173173906e0b4ce/675x476/f7ec2961e6fa3f652cb477e8d18c736f/_output_3_SOFT.png)
  1. head 指向上一版

    4.softhead

  2. index 未改變(a.txt 標記成Modified,b.txt 標記成Added)

    5_softindex

  3. working tree 未改變(內容是新版)

  4. 僅移除commit

    gitresetsoft

2. git reset –mixed

  • 不指定時的預設行為
  • 保留檔案變更
  1. head 指向上一版

    6.mixhead

  2. index 移除staged標記(表示不在 commit 的範圍)

    7_mixindex

    • 2-1. 以a.txt來看

      保留修改,但沒有被納入 staged

    • 2-2. 以b.txt來看

      保留新增,但是untracked

  3. working tree 未改變(內容是新版)

  4. 移除commitstaged

    gitresetmixed

3. git reset –hard

8.HARDhead

  1. head 指向上一版

    9.HARDhead

  2. index 移除staged標記(表示不在 commit 的範圍,且因修改的內容被移除,所以也不會被標記Modified)

    10_hardindex

  3. working tree 移除修改的內容

  4. 完全回到上一版

    gitresethard

結論

名詞解釋
head所在位置
index變更狀態紀錄
working tree工作目錄
modeheadindexworking tree說明
softchangedunchangedunchanged僅移除commit變成新版未 commit,內容仍是新版的
mixedchangedchangedunchangedindex 移除staged標記,變成Modifiedor Untracked,內容是新版的
hardchangedchangedchanged回到上一版版本,其間變更完全移除(接近 svn revert),內容及狀態皆是上一版

操作 Repository:GitHub

整理後清楚多了,就怕結論是錯的XD,如果哪邊寫錯,要請大家多指教。

參考資料

  1. Git 學習筆記 (1):安裝、選項設定、在本地使用 Git 工具
  2. 30 天精通 Git 版本控管 (07):解析 Git 資料結構 - 索引結構
  3. 30 天精通 Git 版本控管 (05):瞭解儲存庫、工作目錄、物件與索引之間的關係