2016-12-25

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

  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

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

  2. 移除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 工作目錄
mode head index working tree 說明
soft changed unchanged unchanged 僅移除commit變成新版未 commit,內容仍是新版的
mixed changed changed unchanged index 移除staged標記,變成Modifiedor Untracked,內容是新版的
hard changed changed changed 回到上一版版本,其間變更完全移除(接近 svn revert),內容及狀態皆是上一版

操作 Repository:GitHub

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

參考資料

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

沒有留言:

張貼留言