文章目錄
Git reset 的三種模式( soft mixed hard )比較
git reset 的三種主要模式(–soft, –mixed,–hard),一直困擾著我不太確定知不知道其中差異,似懂非懂,最近剛好為公司同事進行 Git
教育訓練,藉機來把觀念釐清
情境
- 建立 git repository
- 新增 a.txt
- 修改 a.txt 並 commit
修改 a.txt 並新增 b.txt 後 commit
原始檔案狀態
測試
1. git reset –soft
![3_SOFT](https://trello-attachments.s3.amazonaws.com/583c75c90173173906e0b4ce/675x476/f7ec2961e6fa3f652cb477e8d18c736f/_output_3_SOFT.png)
head 指向上一版
index 未改變(
a.txt
標記成Modified
,b.txt
標記成Added
)working tree 未改變(內容是新版)
僅移除
commit
2. git reset –mixed
- 不指定時的預設行為
- 保留檔案變更
head 指向上一版
index 移除
staged
標記(表示不在 commit 的範圍)2-1. 以
a.txt
來看保留
修改
,但沒有被納入staged
2-2. 以
b.txt
來看保留
新增
,但是untracked
working tree 未改變(內容是新版)
移除
commit
及staged
3. git reset –hard
head 指向上一版
index 移除
staged
標記(表示不在 commit 的範圍,且因修改的內容被移除,所以也不會被標記Modified
)working tree 移除修改的內容
完全回到上一版
結論
名詞 | 解釋 |
---|---|
head | 所在位置 |
index | 變更狀態紀錄 |
working tree | 工作目錄 |
mode | head | index | working tree | 說明 |
---|---|---|---|---|
soft | changed | unchanged | unchanged | 僅移除commit 變成新版未 commit,內容仍是新版的 |
mixed | changed | changed | unchanged | index 移除staged 標記,變成Modified or Untracked ,內容是新版的 |
hard | changed | changed | changed | 回到上一版版本,其間變更完全移除(接近 svn revert),內容及狀態皆是上一版 |
操作 Repository:GitHub
整理後清楚多了,就怕結論是錯的XD,如果哪邊寫錯,要請大家多指教。
參考資料
文章作者 Yowko Tsai
上次更新 2021-11-02
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。