[Git修改提交]剛提交了程式碼,發現寫錯了怎麼辦
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~x
。rebase
是變基操作,就是重新提交HEAD~x
後面的所有提交,通過這種辦法來修改歷史提交內。
開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 12 天,點選檢視活動詳情