[Git修改提交]剛提交了程式碼,發現寫錯了怎麼辦

語言: CN / TW / HK

theme: devui-blue

本節課學習如何修改已提交的commit。

在工作流中,我們在提交程式碼時的描述,是會有約定的,比如實現了一個功能,提交的描述就必須是“feature:描述”。比如修改了一個bug,提交的描述必須是“fixbug#bugId:描述”。比如做了一次合併,提交描述就必須是“merge:描述”。有些時候,我們的描述資訊會寫錯,或者漏寫。那麼我們就需要修改之前的提交資訊。

當然,程式碼改錯了,或者某次提交忘記了帶上某個原始檔修改。這些情況,都需要重新修改之前的提交資訊。

修改最後一次的commit

比如,我現在有一個開發分支dev,上面已經有了4個commit,如圖所示:

修改提交資訊

我發現提交資訊不一致,我需要把最後一次commit資訊改成: 4。 那麼我們可以利用git commit --amend這個命令來修改。 輸入命令:

會彈出下面的資訊,這就是最後一次commit的描述資訊,不過是vim開啟的,如果要編輯,按i(或者a,o都可以),進入編輯模式

修改完成後,按ESC,退出編輯模式,再按:wq,回車儲存退出。這樣,最後一次commit的描述資訊就修改完成了。

使用git log命令檢視commit資訊。可以看到,最後一次提交的資訊已經改成了4

最後推送程式碼,使用git push,我們會發現推送報錯。這是因為git push預設只推送新的提交,我們現在是沒有新提交的,只是修改了已有的提交。所以我們要使用git push --force

我們再看下遠端的提交情況,已經改過來了。

當然,這裡還有一個更加快速的方式,在呼叫amend時,直接修改描述。

修改提交中的程式碼

如果要修改程式碼呢,比如現在我的readme檔案內容是修改 4。我需要把他改成修改 4.2。把檔案內容修改後,我們還是用git commit --amend命令。如下圖,我們可以看到,描述和檔案都修改完成了。

修改之前某次commit

如果要修改之前的某次提交,我們就不能用amend了,amend只能修改當前分支最後一次修改。這次我們需要用到git rebase。Git 本身沒有提供一個改變歷史的工具,但是可以使用變基工具(rebase)來改變提交。

git rebase互動式變基給你一個它將會執行的指令碼。 它將會從你在命令列中指定的提交開始,從上到下的依次重演每一個提交引入的修改。 它將最舊的而不是最新的列在上面,因為那會是第一個將要重演的。 比如我們指定 修改3 開始rebase,那麼 修改3 和 4.2 都會被重新提交。 如果指定rebase到其他分支,比如master分支,那麼 修改3 和 4.2 會被複制到master上。 rebase用多了容易導致程式碼混亂,不要濫用!!

比如,我們想把倒數第2次提交的修改3改成3。那麼利用git rebase我們可以像下面這麼寫。這裡的HEAD~2是指選擇最新提交往前2個提交。

彈出下面的資訊。這裡列出了HEAD~2之後的兩個提交,也就是 修改3 和 4.2 。 我們可以對這兩個都進行修改。具體修改的命令下面列出來了。

比如我們要修改 修改3 這個提交,那麼我們就要把 修改3 前面的pick改成edit。這個也是vim編輯,和前面一樣,按i(或者a,o都可以),進入編輯模式,修改好後,在按ESC退出編輯模式,再輸入:wq回車儲存退出。

儲存好,會給出下一步的提示,我們繼續使用git commit --amend修改描述資訊。

修改完成後,我們看看日誌,會發現修改3已經改成3了,但是4.2不見了。這是因為rebase是逐個去重演提交的,現在只完成了一個提交(修改3)的重演,4.2的重演還沒有開始。

按照上面的提示,我們執行git rebase --continue。

最後看下效果,提交資訊都滿足我們的要求了。

需要拋棄某個commit

現在我們發現提交 “2”屬於無用提交,需要刪掉。怎麼操作。我們還是利用rebase。前面的rebase執行後,有一個drop命令,這個就是移除commit的。

或者我們可以直接刪除對應的提交。

儲存後,會有可能出現程式碼合併的問題,因為rebase是變基,會重新提交後面的每一次提交。所以如果前後程式碼有衝突,就會需要解決後再提交。和前面一樣,需要繼續執行git rebase --continue,直到全部提交都完成。最後結果如圖。

如果分支已經push到遠端

不建議再使用rebase了, 因為已經push到了遠端,你不知道別人有沒有同步到本地, 如果別人已經同步到了本地,你再去修改,就很容易出問題。 這種情況下,使用萬能辦法,提交一個新commit,把前面的錯誤都修改好,並在commit資訊中說明詳細情況。。。

總結

本課主要說到兩個命令 - git commit -amend。這個是修改最後一次提交的命令。 - git rebase -i HEAD~xrebase是變基操作,就是重新提交HEAD~x後面的所有提交,通過這種辦法來修改歷史提交內。

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 12 天,點選檢視活動詳情