我們已經知道:
- reset 直接退回指定的版本
- rebase 對過去的提交編輯、刪除加料
其實還有一個 revert 一直沒有機會介紹。
revert 從功能面來看,比較類似 reset 但從語法面來看比較像 cherry-pick
revert 也是用來後悔也就是退版,但不像 reset 有軟退版與硬退版的差別。
revert 的退版一樣可以指定 commit id 或者使用 HEAD~n 的方式往前退n個版本。
reset 的退版是將 HEAD 指標移到你想要的提交,而該提交之後的所有提交都會消失。
而 revert 最大的不同在於他是增加一個新的提交,也就是一直往前走。所以我們會說是「向前」後悔。
它是用新的提交來反向操作原本想後悔的提交內容。
那如果跟 rebase 比呢?revert 不會破壞所有 commit 的歷史紀錄,也就是不會修改之前或之後的 commit 內容。
語法像 cherry-pick 是因為可能遇到需要處理衝突的狀況,也會有 --continue
或 --abort
之類的參數,並且它是重新建立一個新 commit 的架構。
我舉個例子,現在有一張紙上面有三行字,你發現第二行有錯想修改。
rebase 的做法是移到錯字的地方擦掉直接改成對的,然後原本第二行以後對的地方幫你抄一份內容一樣的上去。
後面的內容雖然一樣,但是其實是重新抄過的。也就是後面的 commit 會重做。而且會修改以前的提交紀錄。
reset 的做法是直接移到錯字之前對的正確地方,讓你自己從那個地方重新寫過(硬退版)。
revert 的做法是在第四行說明第二行的哪邊寫錯,他不會去動已經完成的這些提交內容。感覺上比較軟性,也有人說是禮貌。
這樣 revert 的好處是在共同開發時其他伙伴不會因為某人退版或修改之前的提交推送到倉庫後造成衝突。
因為 revert 是繼續往後做新 commit 所以其他伙伴只要拉回來就好了,就跟其他伙伴推送新的提交是一樣的處理方式。
這也是一個避免因為修改歷史紀錄而需要強制推送專案去蓋掉遠端倉庫,而造成其他開發伙伴的困擾的一個方法。
$ git log -4 --oneline
fd19b27 (HEAD -> main) type: fix system: donor scope: controller/model subject:
修改匯出年度申報資料格式
d9a8147 type: fix system: donor scope: model subject: 修正註解的錯字
6794b21 type: fix system: donor scope: all subject: 修正拼錯字
9a5edfe type: fix system: document scope: view subject: 修正行政後臺顯示簽呈看不
到附件問題
這裡有4個提交,我們想要放棄第4個提交也就是 9a5edfe 但又不想動原本的提交造成其他人的困擾,那就來 revert
$ git revert 9a5edfe
# 跳出編輯提交訊息就寫一下,最好保留原本的 revert 哪一個 commit id 那一段,這樣之後就知道當時是反向操作哪一個提交
[main 9c3f3b6] 將ATT從大寫再改回小寫
1 file changed, 3 insertions(+), 3 deletions(-)
# 看一下 log
$ git log -5 --oneline
9c3f3b6 (HEAD -> main) 將ATT從大寫再改回小寫
fd19b27 type: fix system: donor scope: controller/model subject: 修改匯出年度申
報資料格式
d9a8147 type: fix system: donor scope: model subject: 修正註解的錯字
6794b21 type: fix system: donor scope: all subject: 修正拼錯字
9a5edfe type: fix system: document scope: view subject: 修正行政後臺顯示簽呈看不
到附件問題
# 看最新的提交完整版
$ git log -1
commit 9c3f3b6e1e18ba817c22a7833e391d659af71dea (HEAD -> main)
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Wed Feb 10 10:57:29 2021 +0800
將ATT從大寫再改回小寫
This reverts commit 9a5edfe2ae16892a80137184e2eadcadb6f4afce.
# 這樣才看得到 revert from commit id
我們要來仔細確認一下提交的內容,才能確保反向操作是不是我們想要的結果
# 先來看原本要被 revert commit id 做了什麼
# 比較不精確的說法就是,把 att 都改成大寫 ATT
$ git show 9a5edfe
commit 9a5edfe2ae16892a80137184e2eadcadb6f4afce
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Wed Feb 3 10:50:43 2021 +0800
type: fix
system: document
scope: view
subject: 修正行政後臺顯示簽呈看不到附件問題
diff --git a/sys/template/admin/document/admin_show_petitions.tpl b/sys/template/admin/document/admin_show_petitions.tpl
index 50f047e..2c0062a 100644
--- a/sys/template/admin/document/admin_show_petitions.tpl
+++ b/sys/template/admin/document/admin_show_petitions.tpl
@@ -46,10 +46,10 @@ document.getElementById('navAdminPetitions').className = 'active';
</tr>
</thead>
<tbody>
- {if $data.att|count > 0}
- {section name=loop loop=$data.att}
+ {if $data.ATT|count > 0}
+ {section name=loop loop=$data.ATT}
<tr>
- <td><a href="/admin/document/downloadFile/ATT/{$data.att[loop].fileName}">{$data.att[loop].sourceName}</a></td>
+ <td><a href="/admin/document/downloadFile/ATT/{$data.ATT[loop].fileName}">{$data.ATT[loop].sourceName}</a></td>
</tr>
{/section}
{else}
# 接下來是看一下最新的 commit 內容
# 比較不精確的說法就是,把 ATT 都改回小寫 att
$ git show 9c3f3b6
commit 9c3f3b6e1e18ba817c22a7833e391d659af71dea
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Wed Feb 10 10:57:29 2021 +0800
將ATT從大寫再改回小寫
This reverts commit 9a5edfe2ae16892a80137184e2eadcadb6f4afce.
diff --git a/sys/template/admin/document/admin_show_petitions.tpl b/sys/template/admin/document/admin_show_petitions.tpl
index 2c0062a..50f047e 100644
--- a/sys/template/admin/document/admin_show_petitions.tpl
+++ b/sys/template/admin/document/admin_show_petitions.tpl
@@ -46,10 +46,10 @@ document.getElementById('navAdminPetitions').className = 'active';
</tr>
</thead>
<tbody>
- {if $data.ATT|count > 0}
- {section name=loop loop=$data.ATT}
+ {if $data.att|count > 0}
+ {section name=loop loop=$data.att}
<tr>
- <td><a href="/admin/document/downloadFile/ATT/{$data.ATT[loop].fileName}">{$data.ATT[loop].sourceName}</a></td>
+ <td><a href="/admin/document/downloadFile/ATT/{$data.att[loop].fileName}">{$data.att[loop].sourceName}</a></td>
</tr>
{/section}
{else}
看來沒問題,也可以加 --stat
看一下兩邊提交改的檔案、行數等資訊
精確的說,revert 就是把來源 commit 紀錄,加的改成減的,減的改成加的並做一個新提交,就這樣而已。