<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GitButler on recca0120 技術筆記</title><link>https://recca0120.github.io/tags/gitbutler/</link><description>Recent content in GitButler on recca0120 技術筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-hant-tw</language><lastBuildDate>Fri, 17 Apr 2026 17:00:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/tags/gitbutler/index.xml" rel="self" type="application/rss+xml"/><item><title>GitButler：重新設計 Git 操作體驗的現代版本控制工具</title><link>https://recca0120.github.io/2026/04/17/gitbutler-modern-git-client/</link><pubDate>Fri, 17 Apr 2026 17:00:00 +0800</pubDate><guid>https://recca0120.github.io/2026/04/17/gitbutler-modern-git-client/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post GitButler：重新設計 Git 操作體驗的現代版本控制工具" /&gt;&lt;p&gt;&lt;code&gt;git rebase -i&lt;/code&gt; 是我用得最不順手的指令。每次要調整 commit 順序、拆分或合併，都要在 vim 裡面操作那個清單，然後祈禱 rebase 過程中不要有衝突中斷。衝突一發生，狀態就變得很難掌握。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/gitbutlerapp/gitbutler" target="_blank" rel="noopener"
 &gt;GitButler&lt;/a&gt; 的出發點就是「Git 的概念是對的，但操作介面可以做得更好」。它是一個完整的 Git 用戶端，有 GUI 和 &lt;code&gt;but&lt;/code&gt; CLI，Tauri + Svelte + Rust 架構，底層還是標準 Git，但把幾個最難用的地方重新設計了。&lt;/p&gt;
&lt;h2 id="最核心的差異平行分支"&gt;&lt;a href="#%e6%9c%80%e6%a0%b8%e5%bf%83%e7%9a%84%e5%b7%ae%e7%95%b0%e5%b9%b3%e8%a1%8c%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;最核心的差異：平行分支
&lt;/h2&gt;&lt;p&gt;一般用 Git 的方式是：切到某個 branch 做事，做完再切到另一個。兩件事要同時進行就要切來切去，或者開&lt;a class="link" href="https://recca0120.github.io/p/git-worktree-parallel-work/" &gt;多個 worktree&lt;/a&gt; 手動管理。&lt;/p&gt;
&lt;p&gt;GitButler 的**平行分支（Parallel Branches）**讓你不用切換，直接在同一個工作目錄同時處理多個分支。把某個檔案的變更拖到哪個分支，它就屬於那個分支。&lt;/p&gt;
&lt;p&gt;這對 AI agent 工作流程特別有用——agent 同時修多個地方，不同任務的改動可以拆到不同分支，不用等一個做完再開始下一個。&lt;/p&gt;
&lt;h2 id="疊加分支"&gt;&lt;a href="#%e7%96%8a%e5%8a%a0%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;疊加分支
&lt;/h2&gt;&lt;p&gt;依賴另一個分支的功能開發很常見，例如先開一個 &lt;code&gt;feat/api&lt;/code&gt; 分支，再從上面開 &lt;code&gt;feat/ui&lt;/code&gt; 繼續做。&lt;/p&gt;
&lt;p&gt;傳統做法是 &lt;code&gt;feat/ui&lt;/code&gt; rebase 在 &lt;code&gt;feat/api&lt;/code&gt; 上，但一旦 &lt;code&gt;feat/api&lt;/code&gt; 有更動，就要手動重新 rebase 整個鏈。&lt;/p&gt;
&lt;p&gt;GitButler 的**疊加分支（Stacked Branches）**把這件事自動化。修改任何一層的 commit，上面的分支自動 restack，不需要手動操作。&lt;/p&gt;
&lt;h2 id="commit-管理不需要-rebase--i"&gt;&lt;a href="#commit-%e7%ae%a1%e7%90%86%e4%b8%8d%e9%9c%80%e8%a6%81-rebase--i" class="header-anchor"&gt;&lt;/a&gt;Commit 管理不需要 &lt;code&gt;rebase -i&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;這是讓我最直接有感的部分。GitButler 的 commit 管理全部可以拖拉：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Uncommit&lt;/strong&gt;：把 commit 拆回工作區&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reword&lt;/strong&gt;：直接改 commit message&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amend&lt;/strong&gt;：把工作區的改動加進某個 commit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move&lt;/strong&gt;：把 commit 移到其他位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Split&lt;/strong&gt;：把一個 commit 拆成多個&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Squash&lt;/strong&gt;：合併 commit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前需要 &lt;code&gt;git rebase -i&lt;/code&gt; 的操作，現在拖一拖就完成。&lt;/p&gt;
&lt;h2 id="無限復原"&gt;&lt;a href="#%e7%84%a1%e9%99%90%e5%be%a9%e5%8e%9f" class="header-anchor"&gt;&lt;/a&gt;無限復原
&lt;/h2&gt;&lt;p&gt;所有操作都被記錄在 &lt;strong&gt;Undo Timeline&lt;/strong&gt; 裡，包括 commit、rebase、各種變更。任何時間點都可以回去，不用擔心操作錯了回不去。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;but&lt;/code&gt; CLI 也有對應指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;but operations-log &lt;span class="c1"&gt;# 查看所有操作記錄&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;but undo &lt;span class="c1"&gt;# 復原上一個操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="衝突不再中斷流程"&gt;&lt;a href="#%e8%a1%9d%e7%aa%81%e4%b8%8d%e5%86%8d%e4%b8%ad%e6%96%b7%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;衝突不再中斷流程
&lt;/h2&gt;&lt;p&gt;一般 &lt;code&gt;git rebase&lt;/code&gt; 遇到衝突會直接停下來，要你當場解決才能繼續。如果有多個衝突，要一個一個處理完，整個 rebase 流程才能走完。&lt;/p&gt;
&lt;p&gt;GitButler 的&lt;strong&gt;First Class Conflicts&lt;/strong&gt; 讓 rebase 永遠成功。衝突的 commit 被標記起來，可以之後再處理，也可以按任意順序解決，不會卡住整個工作流程。&lt;/p&gt;
&lt;h2 id="github--gitlab-整合"&gt;&lt;a href="#github--gitlab-%e6%95%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;GitHub / GitLab 整合
&lt;/h2&gt;&lt;p&gt;不用切換到瀏覽器，在 GitButler 裡面直接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開 PR、更新 PR&lt;/li&gt;
&lt;li&gt;看 CI 狀態&lt;/li&gt;
&lt;li&gt;列出 branch 清單&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CLI 版：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;but forge pr create &lt;span class="c1"&gt;# 開 PR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;but forge pr list &lt;span class="c1"&gt;# 列出 PR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="ai-整合"&gt;&lt;a href="#ai-%e6%95%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;AI 整合
&lt;/h2&gt;&lt;p&gt;內建 AI 可以幫你生成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit message&lt;/li&gt;
&lt;li&gt;Branch name&lt;/li&gt;
&lt;li&gt;PR description&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也可以安裝 hooks 讓 Claude Code 或其他 AI agent 直接操作 GitButler，讓 agent 的 Git 管理能力升級。&lt;/p&gt;
&lt;h2 id="安裝"&gt;&lt;a href="#%e5%ae%89%e8%a3%9d" class="header-anchor"&gt;&lt;/a&gt;安裝
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install gitbutler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或直接下載 GUI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://gitbutler.com/downloads&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CLI 工具：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 裝好 GUI 後，but CLI 也一起裝好了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;but --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="跟-git-worktree-的差別"&gt;&lt;a href="#%e8%b7%9f-git-worktree-%e7%9a%84%e5%b7%ae%e5%88%a5" class="header-anchor"&gt;&lt;/a&gt;跟 git worktree 的差別
&lt;/h2&gt;&lt;p&gt;之前寫過&lt;a class="link" href="https://recca0120.github.io/p/git-worktree-parallel-work/" &gt;用 git worktree 同時處理多個分支&lt;/a&gt;，兩者都是解決「平行工作」的問題，但角度不同：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;git worktree&lt;/th&gt;
 &lt;th&gt;GitButler&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;本質&lt;/td&gt;
 &lt;td&gt;Git 原生功能&lt;/td&gt;
 &lt;td&gt;完整 Git 用戶端&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;操作方式&lt;/td&gt;
 &lt;td&gt;命令列&lt;/td&gt;
 &lt;td&gt;GUI + CLI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;多分支平行&lt;/td&gt;
 &lt;td&gt;多個目錄&lt;/td&gt;
 &lt;td&gt;同一個目錄&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Commit 管理&lt;/td&gt;
 &lt;td&gt;需要 rebase -i&lt;/td&gt;
 &lt;td&gt;拖拉操作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;學習成本&lt;/td&gt;
 &lt;td&gt;低（懂 Git 就會）&lt;/td&gt;
 &lt;td&gt;需要熟悉新介面&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;worktree 適合已經習慣 CLI、想要最小化工具依賴的人。GitButler 適合想要完整 GUI 體驗、處理複雜 commit 操作的場景。&lt;/p&gt;
&lt;h2 id="授權說明"&gt;&lt;a href="#%e6%8e%88%e6%ac%8a%e8%aa%aa%e6%98%8e" class="header-anchor"&gt;&lt;/a&gt;授權說明
&lt;/h2&gt;&lt;p&gt;GitButler 用 &lt;strong&gt;Fair Source&lt;/strong&gt; 授權——可以用、看源碼、貢獻，但不能用它做競品產品。&lt;strong&gt;2 年後自動轉為 MIT&lt;/strong&gt;，算是開源但加了一個到期的競業條款。&lt;/p&gt;
&lt;h2 id="參考資源"&gt;&lt;a href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;參考資源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/gitbutlerapp/gitbutler" target="_blank" rel="noopener"
 &gt;GitButler GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitbutler.com" target="_blank" rel="noopener"
 &gt;GitButler 官方文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gitbutler.com" target="_blank" rel="noopener"
 &gt;GitButler 官網&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://fair.io/" target="_blank" rel="noopener"
 &gt;Fair Source 授權說明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>