惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
T
Threatpost
T
Tenable Blog
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
C
Cisco Blogs
H
Heimdal Security Blog
Attack and Defense Labs
Attack and Defense Labs
A
About on SuperTechFans
Last Week in AI
Last Week in AI
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
V
V2EX
Cyberwarzone
Cyberwarzone
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
PCI Perspectives
PCI Perspectives
P
Privacy International News Feed
D
Docker

Butler's Log

Agentic Version Control Benchmarks Grit: rewriting Git in Rust with agents Git Merge 2026 Agent-safe Git with GitButler We’ve raised $17M to build what comes after Git Announcing the GitButler CLI for Linux The Great CSS Expansion A couple of git nits Simplifying Git by Using GitButler Introducing the GitButler CLI GitButler 0.19 - "Commander Keen" But Head: Crafting a Custom Font MCP vs RAG: Two Very Different Ways to Gain Context Getting Started With GitButler Agents Using the GitButler MCP Server to Build Better AI-Driven Git Workflows Using GitButler With Multiple GitHub Accounts Advent of Code! Upcoming GitButler Events Use GitButler for your Gerrit workflow Integrating GitButler and GitHub Enterprise Butler Flow: shipping code faster (but less like Alfred, more like CI on steroids) - Part 3 Butler Flow: shipping code faster (but less like Alfred, more like CI on steroids) - Part 1 Grid Happens: Because Flexbox Wasn’t Enough Using Cursor Hooks for automatic version control Deep Dive into the new Cursor Hooks A Responsive Item Counter with CSS only GitButler 0.16 - "Sweet Sixteen" GitButler's Claude Code tab GitButler's Annual Open Source Pledge Report Git Mini Summit 2025 Videos Automate Your AI Workflows with Claude Code Hooks Managing Multiple Claude Code Sessions Without Worktrees GitButler 0.15 - "Quirky Quinceañera" 20 years of Git. Still weird, still wonderful. GitButler's new patch based Code Review (Beta) Going down the rabbit hole of Git's new bundle-uri How to do patch-based review with git range-diff How Core Git Developers Configure Git Why is Git Autocorrect too fast for Formula One drivers? Stacked Branches with GitButler Git Merge 2024 Talks are Up GitButler 0.13 - "Lucky Baseball" Fearless Rebasing Git Merge 2024 Why GitHub Actually Won GitButler is joining the Open Source Pledge The New Era of Town Hall Chat The Future of Open Source GitButler is now Fair Source Git Merge 2024 GitButler 0.12 - "Stingy Baker" The Birth of THE MERGE GitButler for Windows Fixing up Git with Autosquash The Git Zeitgeist Git Worktrees and GitButler DevWorld Git Slides Git Tips and Tricks Git Tips 1: Oldies but Goodies Git Tips 2: New Stuff in Git Git Tips 3: Really Large Repositories FOSDEM Git Talk Opening Up GitButler Debugging Tauri in VS Code Advent of GitButler Code Signing Commits in Git, Explained Virtual Branches Alpha Our We Are Developers Adventure Building Virtual Branches DevDays in Vilnius The Future of Software and Open Source Introducing GitButler
Butler Flow: shipping code faster (but less like Alfred, more like CI on steroids) - Part 2
PJ Hagerty · 2025-10-29 · via Butler's Log

Let’s walk through a hypothetical scenario of using Butler Flow day-to-day, showing how its mechanics reduce friction.

First, your project defines a target branch (say main or production). This is the baseline for all work. Every change is implicitly relative to that branch. Without a target branch, virtual branching doesn’t function.

First, your project defines a target branch (say main or production). This is the baseline for all work. Every change is implicitly relative to that branch. Without a target branch, virtual branching doesn’t function.

You start coding. As soon as you begin editing, GitButler sees that you don’t have an active virtual branch, so it auto-creates one for you. Now your work is tracked under, say, virtual/1234 (just a conceptual name).

You develop your feature or fix. All changes are owned by this virtual branch.

Meanwhile, your teammate is also working on virtual/abcd. Their upstream branch exists in the central Git repository.

Let’s say you want to merge or test your teammate’s changes together with yours before a shared PR. In a traditional flow, you’d either:

  1. Switch to their branch, merge main into it, test, then switch back; or
  2. Rebase both branches locally; or
  3. Create a feature-integration branch that merges them.

But in Butler Flow, you can simply apply their branch on top of your working directory — without switching context — effectively layering their changes on top of yours.

You still haven’t merged anything upstream; you’re just testing integration locally.

Each virtual branch is reviewable independently. You push your virtual branch upstream (or push a corresponding real Git branch), create a PR, and teammates review it.

Because you could test integration locally with other branches, you have confidence that your changes play well with other developers’ work. That makes reviews more reliable and less risky.

Merge and cleanup

Upon final review, you merge your branch into the target branch (the usual Git operation: rebase, merge, squash, whatever your team policy). When that merge is done, GitButler recognizes that the virtual branch is fully integrated, and automatically disposes of it (when you update base and GitButler sees that the branch is include). That cleanup is transparent to you.

This automatic lifecycle (start, review, merge, dispose) is what keeps your workspace clean.

When Butler Flow shines (and when it doesn’t)

  • Teams shipping frequently — if you’re deploying multiple times per day or every day, the friction of merging and conflict resolution looms large. Butler Flow’s early integration and minimal context switching can really help.
  • Medium to large codebases — when there is more surface area for merge conflicts and more people changing related parts, catching conflicts early pays big dividends.
  • Interdependent work — when multiple devs are touching overlapping modules or shared areas, you need a way to safely test combinations before merging. Butler Flow makes that easier.
  • Desire to reduce branch overhead — if your team finds branch management (cleanup, rebase, switching) draining, the automation in Butler Flow alleviates that burden.
  • Small teams or solo projects — if you rarely have overlapping work and you deploy infrequently, the gains may be marginal relative to adopting a new toolchain.
  • Highly restricted legacy environments — environments where you can’t install or integrate GitButler, or where existing tooling is rigid, may block adoption.
  • Rigid Git workflows / policies — if your team is unwilling or unable to change merge rules, branch discipline, or adopt new abstractions, Butler Flow will face resistance.
  • Complex, long-running feature branches — while Butler Flow supports longer-lived branches, its strength is in keeping branches short and integrative. If you have massive features that take weeks isolated, you may lose some benefit.

Here are guidelines and patterns to get the most out of Butler Flow (and avoid pitfalls).

  1. Keep branches small & focused The more isolated and short-lived the virtual branch, the easier it is to integrate. If a branch goes on for too long, it builds drift and conflicts

  2. Merge often / integrate continuously Bring upstream changes from the target branch frequently. Use the “apply” mechanism to test interactions early. Don’t wait until the end.

  3. Review early and in isolation Use branches in isolation for review; use the apply / test combination feature only when needed. Don’t blindly layer many branches before review.

  4. Have a clear merging policy Decide whether your team favors squash merges, rebase, or standard merge. Be consistent. Butler Flow doesn’t remove decision-making; it just improves your flexibility.

  5. Train developers on the mental model Because virtual branching is unfamiliar, invest time in onboarding, documentation, and pair programming. Help your team internalize the idea that changes are “owned” by branches but can be composed.

  6. Integrate with CI / test pipelines Make sure your continuous integration and test systems understand or work well with GitButler / virtual branch setups. For example, your workflows for PR testing, merge hooks, code scanning should be compatible.

  7. Limit stacking of many branches Avoid situations where a developer has dozens of virtual branches applied simultaneously. That could lead to complexity. Use discipline to integrate and finish branches.

  8. Monitor for conflict hotspots Using analytics or logs, find parts of the codebase that often produce conflicts when branches are applied. These may need better modularization, clearer boundaries, or refactoring.

In our first post, we introduced you to Butler Flow. Here we've covered a bit more of the practical use of Butler Flow. In our next and final part, we'll take an even deeper dive into some examples. Make sure to checkout the docs on Butler Flow and join our discord server to chat with the team!

PJ Hagerty

Written by PJ Hagerty

PJ Hagerty is a well-known figure in the tech industry, particularly within the developer relations and DevOps communities. He's also Head of Developer and Community Relations at GitButler.

Table of Contents

  • Setup: choose your target branch
  • Setup: choose your target branch
  • Start working on a change
  • Bringing in a teammate’s work for integration
  • Review & PR
  • Merge and cleanup
  • When Butler Flow shines (and when it doesn’t)
  • Good fits: where you’ll see big wins
  • Less ideal or challenging scenarios
  • Best practices for adopting Butler Flow
  • Conclusion