利用 Git fixup 和 autosquash 整理 commit

更新 發佈閱讀 4 分鐘
本文同步刊載於筆者個人網站:https://hhming.moe/post/git-fixup-and-autosquash/

最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixupgit rebase -i <sha> --autosquash

研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。

說明

簡單來說,之前的我如果在 commit 之後,發現有問題的話,通常會採取下面幾種做法之一:

  1. 直接修改、add、commit,然後使用 rebase 來 squash commit
  2. git reset HEAD~ --soft 修改後重新 commit

上述兩種做法都可以在 local 整理好 commit log 再推出去,就會乾淨漂亮。缺點就是會比較麻煩,尤其是在改完其他東西 commit 後才發現,就要在 rebase 的時候調換順序來 squash,有時一個不小心可能會出現意外情況(我自己是沒碰過,畢竟 rebase 本身就有風險,使用時都要特別小心)。

而本文這次重點的 fixup 和 autosquash 就可以避免這個問題:在進行修補的時候,直接按照一般方式修改後,使用 git commit --fixup <被修補的 commit sha>,然後 push 之前使用 git rebase -i <本次操作之前沒問題的 commit sha> --autosquash 就可以了。

聽起來好像非常美好,實際使用如何呢?接著就是動手嘗試的時間了!

動手試試看

連續提交

首先開一個資料夾,然後初始化一下:

接著新增一個文字檔 a.txt:

root commit

root commit

讓我們來寫一下裡面的內容:

git fixup
vocus|新世代的創作平台

此時我們完成了 commit 但是發現打錯了,並沒有 git fixup 這個指令,因此要修正一下內容:

- git fixup

+ git commit --fixup

不過 commit 之前,先看一下我們 patch 對象 commit sha,並且加在這次 commit 指令上:

git commit --fixup=5df42ec
vocus|新世代的創作平台

如果有實際動手操作的話,應該會發現當執行 fixup commit 的時候,不會跳出編輯器,commit message 直接帶入 fixup! <patch 對象的 commit message>

接著來試試 autosquash 吧:

git rebase -i 0e5bfc8 --autosquash

此時會跳出編輯器,就和一般的互動式 rebase 一樣,唯一不同的是他在 fixup commit 那邊自動改為 fixup

互動式 rebase 畫面

互動式 rebase 畫面

直接儲存,來看看差異:

rebase fixup 後

rebase fixup 後

看起來不錯,commit log 整理的乾乾淨淨,而且還少了一次寫多餘的 commit message 的工。

跨提交

那如果是跨越一個或以上的提交,也能這樣玩嗎?我們用現在這個測試用的 repo 繼續試試看!

首先把剛剛 rebase 的指令也加上去:

加上 rebase 指令到文字檔

加上 rebase 指令到文字檔

接著回頭再修正一開始 fixup 指令中少的 =

- git commit --fixup

+ git commit --fixup=
vocus|新世代的創作平台

OK 現在我們再來執行一次相同的 rebase 指令試試看:

vocus|新世代的創作平台

可以發現 commit 的順序被自動的調換了!所以我們也不需要做什麼變更,直接儲存並執行 rebase:

vocus|新世代的創作平台

居然有衝突?原先預期應該是直接完成變基才對啊?好吧來看看發生什麼事:

vocus|新世代的創作平台

微妙……反正修一下就好對吧,還算簡單……

結果還是衝突= =

總之依樣畫葫蘆,再改一下就對了。

但是注意一點,雖然對後面 fixup! commit 來說,rebase 那行已經存在(文字檔第二行),可是在第一次解衝突的時候,那行是不該存在的!因為後面才會由第三個 commit 新增,所以記得只保留第一行(fixup 那行)就好。

跨提交一樣能完成

跨提交一樣能完成

結語

如果問我的話,因為常常使用 rebase 來壓縮 commit 或直接 reset 來整理 commit history,所以理解這項功能的使用並不難。不過如果是跨提交的情況下,對 rebase 操作不熟悉的人,使用上就比較危險一點。但這個東西確實能加快速度,省掉 patch commit message 的時間,之後有機會再來用用(但希望仍是可以盡量確認後再提交是最好的)。

最後提醒大家一點,這東西很明顯的就是 rebase 的應用,代表 commit sha 是會被變更的。如果已經推出去了,除非是只有自己在使用的分支,否則建議還是走一般的 commit 方式修正,避免其他人 pull 下來整個亂七八糟。

留言
avatar-img
hms5232的沙龍
5會員
25內容數
hms5232的沙龍的其他內容
2025/04/03
輕小說式標題,看標題就看完整篇文。重點就是標題說的,有興趣聽廢話再點進來吧。
Thumbnail
2025/04/03
輕小說式標題,看標題就看完整篇文。重點就是標題說的,有興趣聽廢話再點進來吧。
Thumbnail
2025/03/15
謝謝蘇媽讓我的 9700X 突飛猛進,讓我拿到 3DMark Free PC Upgrade 成就!
Thumbnail
2025/03/15
謝謝蘇媽讓我的 9700X 突飛猛進,讓我拿到 3DMark Free PC Upgrade 成就!
Thumbnail
2024/12/29
上個月還在職的時候,公司有提供一些名額給員工報名參加這次的台北葡萄酒馬拉松。雖然我自己並沒特別喜歡喝紅酒,不過既然有免費的機會,當然是要去看看了!(不知道哪裡來的勇氣,相信自己能跑馬拉松)
Thumbnail
2024/12/29
上個月還在職的時候,公司有提供一些名額給員工報名參加這次的台北葡萄酒馬拉松。雖然我自己並沒特別喜歡喝紅酒,不過既然有免費的機會,當然是要去看看了!(不知道哪裡來的勇氣,相信自己能跑馬拉松)
Thumbnail
看更多
你可能也想看
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
GitLab為程式碼管理倉庫,且從8.0開始提供CI/CD。 安裝 更新套件索引 sudo apt update 安裝postfix sudo apt install ca-certifi​cates curl openssh-server postfix 切換目錄 cd /t
Thumbnail
GitLab為程式碼管理倉庫,且從8.0開始提供CI/CD。 安裝 更新套件索引 sudo apt update 安裝postfix sudo apt install ca-certifi​cates curl openssh-server postfix 切換目錄 cd /t
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
在 Ubuntu 22.04 上使用 GitLab,請依照下列步驟操作。首先,使用nano文字編輯器開啟「gitlab.rb」檔案並尋找存取GitLab的URL: sudo nano /etc/gitlab/gitlab.rb 到下面的連結以使用 Ubuntu 22.04 上的 GitL
Thumbnail
在 Ubuntu 22.04 上使用 GitLab,請依照下列步驟操作。首先,使用nano文字編輯器開啟「gitlab.rb」檔案並尋找存取GitLab的URL: sudo nano /etc/gitlab/gitlab.rb 到下面的連結以使用 Ubuntu 22.04 上的 GitL
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixup 和 git rebase -i <sha> --autosquash。 研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。
Thumbnail
最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixup 和 git rebase -i <sha> --autosquash。 研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。
Thumbnail
這篇文章將介紹工程師使用版控和git的相關知識和技能,包括版本控制的意義和git的基本指令,以及開發流程和webhook的概念。
Thumbnail
這篇文章將介紹工程師使用版控和git的相關知識和技能,包括版本控制的意義和git的基本指令,以及開發流程和webhook的概念。
Thumbnail
GitLab 是一個 DevOps、基於 Web 的免費開源平台 Git 儲存庫,為開發人員提供了所有必要的功能。它是一個用於開發 DevOps 應用程式的一體式平台。 GitLab 允許您執行原始碼管理、監控、安全性和專案規劃任務。 Update system packages: sudo
Thumbnail
GitLab 是一個 DevOps、基於 Web 的免費開源平台 Git 儲存庫,為開發人員提供了所有必要的功能。它是一個用於開發 DevOps 應用程式的一體式平台。 GitLab 允許您執行原始碼管理、監控、安全性和專案規劃任務。 Update system packages: sudo
Thumbnail
本篇文章介紹如何使用Git Bash進行版本控制操作,包括創建repository、查看狀態、歷程以及加入暫存和提交暫存等操作。透過基本的Git指令,您可以更深入地瞭解Git工具的使用方法。
Thumbnail
本篇文章介紹如何使用Git Bash進行版本控制操作,包括創建repository、查看狀態、歷程以及加入暫存和提交暫存等操作。透過基本的Git指令,您可以更深入地瞭解Git工具的使用方法。
Thumbnail
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News