Git的reset和revert有什麼區別?它們分別適用於什麼場景?

王铁柱6發表於2024-11-24

在Git中,resetrevert 都是用於撤銷更改的命令,但它們的工作方式和應用場景不同。理解它們的區別對於正確地管理程式碼歷史至關重要。

git reset

  • 功能: 將當前分支的HEAD指標移動到指定的提交,並根據引數的不同,可以選擇性地修改暫存區和工作目錄。它本質上是改變當前分支的歷史記錄,讓其指向一個新的提交。被回退的提交之後的提交記錄在 reflog 中仍然可以找到,但如果不進行恢復操作,一段時間後會被Git自動清理。

  • 場景:

    • 本地開發,還未推送: 當你提交了一些錯誤的更改,或者想放棄一些本地的修改,可以使用 reset 來撤銷這些更改。
    • 修改提交歷史: 例如,合併多個提交為一個,或者修改某個提交的message。
    • 放棄合併: 如果你在合併分支時遇到衝突,並且決定放棄合併,可以使用 reset 回到合併前的狀態。
  • 引數:

    • --soft: 只移動HEAD指標,暫存區和工作目錄不變。修改仍然保留在暫存區。
    • --mixed (預設): 移動HEAD指標,重置暫存區,工作目錄不變。修改保留在工作目錄,但不再被Git追蹤。
    • --hard: 移動HEAD指標,重置暫存區和工作目錄。修改將被徹底刪除,要謹慎使用。
  • 示例:

    • git reset HEAD^: 回退到上一個提交,修改保留在暫存區。
    • git reset --hard HEAD~2: 回退到前兩個提交,所有修改都將被刪除。
    • git reset <commit_hash>: 回退到指定的提交。

git revert

  • 功能: 建立一個新的提交,用於撤銷指定提交的更改。它不會改變現有的提交歷史,而是透過反向應用之前的更改來實現撤銷。

  • 場景:

    • 已經推送的提交: 當你需要撤銷一個已經推送到遠端倉庫的提交時,應該使用 revert,因為它不會修改已有的提交歷史,避免了團隊協作中的混亂。
    • 只想撤銷某個特定提交: revert 可以精確地撤銷某個提交的更改,而不會影響其他提交。
  • 示例:

    • git revert <commit_hash>: 建立一個新的提交,用於撤銷指定提交的更改。

總結:

特性 git reset git revert
修改歷史 會修改分支歷史 不會修改分支歷史,而是建立一個新的提交
應用場景 本地開發,未推送的修改 已經推送的提交
安全性 相對低,可能會丟失提交 相對高,保留完整的提交歷史
精確度 可以回退到任意提交 可以精確撤銷某個提交的更改

前端開發場景的建議:

在前端開發中,如果修改只存在於本地,並且你確定不需要這些修改,可以使用 git reset 來快速清理。但如果修改已經推送到遠端分支,或者你只是想撤銷某個特定的提交,為了避免影響團隊協作和程式碼歷史的完整性,強烈建議使用 git revert。 尤其是在多人協作的專案中,revert 更安全可靠。

相關文章