利用 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
raw-image

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

- git fixup

+ git commit --fixup

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

git commit --fixup=5df42ec
raw-image

如果有實際動手操作的話,應該會發現當執行 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=
raw-image

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

raw-image

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

raw-image

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

raw-image

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

結果還是衝突= =

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

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

跨提交一樣能完成

跨提交一樣能完成

結語

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

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

留言
avatar-img
留言分享你的想法!
avatar-img
hms5232的沙龍
5會員
22內容數
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
這篇文章將介紹工程師使用版控和git的相關知識和技能,包括版本控制的意義和git的基本指令,以及開發流程和webhook的概念。
Thumbnail
這篇文章將介紹工程師使用版控和git的相關知識和技能,包括版本控制的意義和git的基本指令,以及開發流程和webhook的概念。
Thumbnail
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
本篇文章介紹如何使用Git Bash進行版本控制操作,包括創建repository、查看狀態、歷程以及加入暫存和提交暫存等操作。透過基本的Git指令,您可以更深入地瞭解Git工具的使用方法。
Thumbnail
本篇文章介紹如何使用Git Bash進行版本控制操作,包括創建repository、查看狀態、歷程以及加入暫存和提交暫存等操作。透過基本的Git指令,您可以更深入地瞭解Git工具的使用方法。
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
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixup 和 git rebase -i <sha> --autosquash。 研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。
Thumbnail
最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixup 和 git rebase -i <sha> --autosquash。 研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。
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
GitLab 是一個 DevOps、基於 Web 的免費開源平台 Git 儲存庫,為開發人員提供了所有必要的功能。它是一個用於開發 DevOps 應用程式的一體式平台。 GitLab 允許您執行原始碼管理、監控、安全性和專案規劃任務。 Update system packages: sudo
Thumbnail
GitLab 是一個 DevOps、基於 Web 的免費開源平台 Git 儲存庫,為開發人員提供了所有必要的功能。它是一個用於開發 DevOps 應用程式的一體式平台。 GitLab 允許您執行原始碼管理、監控、安全性和專案規劃任務。 Update system packages: sudo
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News