less than 1 minute read     Posted on:     Updated on:

Introduce to Git Reset

開發者最喜歡 Git 的其中一個很大的原因就是即使你做錯了 仍然可以重來
使用 git reset 可以幾乎拯救所有 “不小心的操作”(只要 .git 資料夾還存在的情況下)

接下來就帶大家仔細看看這個指令吧!

Reset mode

git reset 總共擁有 6 種模式

  • --soft
    • 當你想要做,比如說取消上一筆 commit 或者是 split commit 的時候可以用
      用法為 $ git reset --soft HASH

    這個參數對 commit history 以及 file changes 都沒有影響, 所有資料仍然會保留 如上圖所示,reset 之後更改完的檔案會在 staging area 裡面

  • --hard
    • 使用 –hard 這個參數會將檔案以及 commit history 全部 reset 用法為 $ git reset --hard HASH

    那萬一你想要回復 reset hard 的這個操作呢? 也是有辦法的
    git reflog 裡面包含所有 操作歷史, 你可以 reset hard 到 reset hard 的前一個狀態(聽起來是不是有點繞口哈哈哈)

    從上圖你可以很清楚的看到 git reflog 裡面包含了所有使用者執行的操作,也因此你可以透過 reset hard 到某個時間點(在你還沒搞砸之前)
    reset hard 以及 reflog 可以說是我用版本控制以來最強的絕招之一了
    學會了他想必你可以在事情搞砸的時候救回來

  • --mixed(default)
    • 預設模式下, 所有已經改動的檔案全部會被 unstage, commit history 不會有任何更動
  • 剩下還有 --keep, --merge, --[no-]recurse-submodules 就不一一列舉了

Reset to Remote branch

另外一個我很常用的情境就是當多人合作的情況下
當多個人在同一個 branch 底下做事情的時候,你 pull 其他人的 changes 卻出現 conflict 而你不想解的時候
就可以用 $ git reset --hard origin/BRACH-NAME 來全部重設

此情況僅適用於你確定 local changes 可以全部丟棄
當然如果你手殘還是可以用 git reflog 下去救

Split Commit

要怎麼把單一筆 commit 拆成多筆呢?
事實上 git 並沒有提供此類 command 但我們可以透過 git rebase 來達成

git rebase –soft 在上面有提到是將所有 file changes 全部變成 staged 的狀態(i.e. 退回到 commit 之前的狀態)
這時候你就可以手動挑你要的 file changes 逐一 commit

記得要將還沒要 commit 的檔案 unstage 哦($ git restore –staged FILE.NAME)

References

Leave a comment