使用git interactive rebase改寫commit歷史
只要是有使用過git進行版本控制,一定會發生commit了之後反悔的情況。若僅想要訂正部份commit內容,可使用commit –amend, 但若想要將commit「移除」,則有兩種作法:git revert或git interactive rebase.
git revert實際上並非真的將commit移除,而是將錯誤的commit內容「倒著做」。若是被刪除的內容就將其補回,被新增的內容則將其刪除,然後再新增一個commit. 因此,錯誤的commit仍會留在歷史上,如下圖:
如果該錯誤commit僅存在於本地端,則可選擇使用git interactive rebase將其移除。切記此作法將會影響commit history, 若已推上remote供他人使用,則應使用前者作法 revert + push, 以免導致他人在pull程式時發生版本衝突。
範例:新建repo, 並新增文本"mytext.txt"。 填入內容後commit:
隨意於文本新增內容,再commit. 重複兩次,總共三個commit.
使用cat檢視文本內容。使用git log確認要移除的rebase的目標hash, 目標應是比「欲移除的commit」更早的commit. 假設欲移除的是第三個commit, 則可rebase至第一或第二個commit.
此時可選擇如何處置「rebase目標commit」至最新commit之間的各個commit. 若反悔,不想再繼續rebase, 應將當前畫面中的文字全數清空,然後儲存並退出。
將要移除的commit前的"pick"改為"drop", 亦可將該列刪除。完成後儲存並退出。
出現"Successfully rebased and updated …"文字即代表成功。使用git log確認該錯誤commit已被移除,並使用cat確認文件內容確實再無第三個commit的改變痕跡。
以上就是使用git interactive rebase改寫commit歷史的介紹囉!喜歡歐斯瑞文章的讀者們,記得追蹤歐斯瑞FB粉絲團及Instagram,也別忘了訂閱我們的電子報,隨時掌握第一手最新消息呦!有任何問題也歡迎隨時聯繫我們!
我要留言