面試官:說說你對 git reset 和 git revert 的理解?區別?

一、是什麼

git reset

reset用於回退版本,可以遺棄不再使用的提交

執行遺棄時,需要根據影響的範圍而指定不同的參數,可以指定是否復原索引或工作樹內容

git revert

在當前提交後面,新增一次提交,抵消掉上一次提交導致的所有變化,不會改變過去的歷史,主要是用於安全地取消過去發佈的提交

二、如何用

git reset

當沒有指定ID的時候,默認使用HEAD,如果指定ID,那麼就是基於指向ID去變動暫存區或工作區的內容

// 沒有指定ID, 暫存區的內容會被當前ID版本號的內容覆蓋,工作區不變
git reset

// 指定ID,暫存區的內容會被指定ID版本號的內容覆蓋,工作區不變
git reset <ID>

日誌ID可以通過查詢,可以git log進行查詢,如下:

commit a7700083ace1204ccdff9f71631fb34c9913f7c5 (HEAD -> master)
Author: linguanghui <linguanghui@baidu.com>
Date:   Tue Aug 17 22:34:40 2021 +0800

    second commit

commit e31118663ce66717edd8a179688a7f3dde5a9393
Author: linguanghui <linguanghui@baidu.com>
Date:   Tue Aug 17 22:20:01 2021 +0800

    first commit

常見命令如下:

git revert

git reset用法基本一致,git revert 撤銷某次操作,此次操作之前和之後的 commithistory都會保留,並且把這次撤銷,作爲一次最新的提交,如下:

git revert <commit_id>

如果撤銷前一個版本,可以通過如下命令:

git revert HEAD

撤銷前前一次,如下:

git revert HEAD^

三、區別

撤銷(revert)被設計爲撤銷公開的提交(比如已經 push)的安全方式,git reset被設計爲重設本地更改

因爲兩個命令的目的不同,它們的實現也不一樣:重設完全地移除了一堆更改,而撤銷保留了原來的更改,用一個新的提交來實現撤銷

兩者主要區別如下:

git revert 是用一次逆向的 commit“中和” 之前的提交,因此日後合併老的 branch 時,之前提交合並的代碼仍然存在,導致不能夠重新合併

但是 git reset 是之間把某些 commit 在某個 branch 上刪除,因而和老的 branch 再次 merge 時,這些被回滾的 commit 應該還會被引入

參考文獻

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Z3kLQz67omQdT8GA5LsC7g