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

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
V
Visual Studio Blog
有赞技术团队
有赞技术团队
U
Unit 42
D
Docker
小众软件
小众软件
F
Full Disclosure
I
Intezer
Scott Helme
Scott Helme
P
Privacy International News Feed
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
B
Blog
Martin Fowler
Martin Fowler
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
S
Security Affairs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
Schneier on Security
Schneier on Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Threat Research - Cisco Blogs
量子位
Hacker News - Newest:
Hacker News - Newest: "LLM"
H
Heimdal Security Blog
N
Netflix TechBlog - Medium
H
Hacker News: Front Page
P
Proofpoint News Feed
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
S
Schneier on Security

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 2 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 3
PJ Hagerty · 2025-11-05 · via Butler's Log

(NOTE: Before starting this article, you may want to review part one and part two of the Butler Flow series.)

A deeper dive: integration, conflicts, and example patterns

Let’s explore some patterns you might adopt with Butler Flow, especially around integrating branches, resolving conflicts, and structuring your work.

Suppose you have two kinds of work going on: features and fixes/iterations. With virtual branches, you can maintain a “fix branch” (virtual branch) that gets small urgent patches, and a “feature branch” for a bigger feature. Locally, you can apply the fix branch on top of your feature branch and test. If the fix branch is merged, it is disposed; your feature work continues with that fix baked in.

Thus, virtual branching gives you flexible layering of workstreams.

You might start an experimental virtual branch but not merge it just yet. Meanwhile, you continue with mainline work. Because branches can be applied and un-applied, you can test what happens when your experimental work is layered on top of your primary branch. If it fails, you roll it back; if good, you eventually merge. The ability to layer/unlayer gives you safety.

Because applying another branch triggers conflicts early, you get a safety net: you and your teammate can talk through conflicts before the PR stage. Instead of surprise late-stage merge conflicts, you can resolve dependencies and coordinate earlier.

For non-trivial conflicts, the branches can be un-applied, re-applied, or isolated until ready. The idea is to localize conflict resolution and avoid polluting master.

If branch B depends on branch A, you can apply A first, then apply B on top. Because branches are isolated, you maintain clarity about what’s layered. If you have multiple branches that depend on each other, the ordering matters — but Butler Flow supports composition. This gives you more flexibility than a flat linear branch model.

Here’s a fictional (but realistic) day using Butler Flow in a team of developers working on a product backend + frontend.

  1. Morning Stand-up Alice picks up a story to implement a search feature. Bob has started a fix for a production bug. Carol is working on an API refactor. The main branch is stable and up to date.

  2. Alice begins work Alice edits files; GitButler creates virtual/AliceSearch. She codes away.

  3. Bob's bug fix Bob starts virtual/BugFix123. He pushes it, triggers a PR, review is underway.

  4. Alice wants to integrate Bob’s fix Without switching branches, Alice applies Bob’s branch to her working directory. She sees a minor conflict in shared modules, resolves it, and continues. Now Alice’s working directory includes her search changes + Bob’s bug fix. She tests the combined behavior.

  5. Carol's refactor Carol’s branch virtual/RefactorAPI is pushing large changes. Alice optionally applies that too, but maybe defers until later.

  6. Alice asks for a review Alice pushes virtual/AliceSearch, opens a PR against main. Bob reviews. Meanwhile, she might pull in Carol’s changes for testing before final merge.

  7. Bob’s bug fix merges Bob’s branch is approved and merged into main. GitButler sees that virtual/BugFix123 is integrated, so it disposes it from Alice’s local context — the applied changes remain, but the virtual branch itself disappears. Alice doesn’t need to manually prune it.

  8. Alice finishes and merges After review, Alice’s changes merge into main. GitButler auto-cleans virtual/AliceSearch. Her workspace is clean. She starts the next change; a new virtual branch is auto-created.

Through this flow, Alice never had to switch contexts awkwardly, Bob’s fix was layered and tested early, conflicts were resolved early, and cleanup happened automatically.

Common objections, FAQs, and counterpoints

Below are some concerns you may hear or have, and responses to them.

Virtual branching abstracts over patch sets and rebasing, but gives you additional composability: you can stack unmerged branches, test combinations, and dispose of them automatically. It’s more flexible and safer than juggling rebases or hand-crafted patch order.

“What about CI and merging definitions?”

You still need a CI pipeline. PRs from virtual branches should run your tests and checks. The target branch merge process (squash, rebase, or merge) still matters. Butler Flow doesn’t eliminate merging discipline; it complements it.

True. You need to trust and understand what GitButler is doing. But the abstraction is fairly thin - virtual branches map to changesets, applications are merges / rebases under the hood, and cleanup is deterministic. With monitoring and good tooling, you can mitigate “magic” surprises.

Yes, insofar as branches pushed upstream can be reviewed in standard PR flows. Virtual branches are a local abstraction; the remote ends up as normal Git branches (or commits) for review and merging.

“What about large refactors and architectural changes?”

You can still do big work. But you’ll want to break them into smaller chunks as much as possible to preserve the integrability advantages. Use virtual branches to layer parts progressively, test in stages, and merge incrementally

If you like the sound of Butler Flow, here are some steps to ease adoption:

  1. Start with a pilot team Pick one team or a feature where the benefits of early merging and integration are pressing. Let them try Butler Flow first.

  2. Train developers on virtual branch thinking Use workshops, pair programming, and example scenarios to help people internalize the idea of applying branches vs switching branches.

  3. Integrate with your existing CI pipeline Make sure your CI tests work well when virtual branches are applied; ensure merge hooks, linting, code scanning, etc., are compatible.

  4. Define merge/branching policies up front Without switching branches, Alice applies Bob’s branch to her working directory. She sees a minor conflict in shared modules, resolves it, and continues. Now Alice’s working directory includes her search changes + Bob’s bug fix. She tests the combined behavior.

  5. Monitor and measure Track metrics - time from code commit to deployment, number of merge conflicts, branch lifetime, developer satisfaction. See if Butler Flow gives you measurable improvement.

  6. Iterate and refine As with everything in building codebases, as you use it you may discover anti-patterns (e.g. too many branches stacked, complex dependency graphs). Adjust policies to keep branches focused, short-lived, integrable.

  7. Encourage collaboration early Because integration is cheap, encourage developers to apply each other’s branches early. Use pair programming or “merge previews” as a habit.

Butler Flow is not a magic wand. It won’t solve every development pain. But for modern teams hungry to ship fast, reduce merge friction, and keep developer experience pleasant, it offers a compelling hybrid model of branching.

By combining the simplicity of GitHub Flow with richer branch composability via virtual branches, Butler Flow enables:

  • Early integration and conflict visibility
  • Minimal context switching
  • Automatic cleanup
  • Safer, more confident merges

If your team frequently runs into merge conflicts, or struggles with branch management overhead, or simply wants to accelerate its shipping cadence, Butler Flow is worth considering. Check out our documentation and reach out to the team on discord for more tips and tricks!

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

  • A deeper dive: integration, conflicts, and example patterns
  • Pattern: feature + fix workstreams
  • Pattern: experimental features/toggles
  • Conflict resolution - early, collaborative
  • Dependency branching & ordering
  • Example scenario: a day in the life with Butler Flow
  • Common objections, FAQs, and counterpoints
  • Tips for adopting Butler Flow in your team
  • Conclusion