# Nhiều agent làm song song trong một thư mục với GitButler

[Scott Chacon](https://homus.dev/speakers/scott-chacon) · [GitButler](https://homus.dev/orgs/gitbutler)

> Cài skill GitButler bằng but agent setup rồi cho ba agent Claude Code và Cursor làm ba feature trên parallel và stacked branch, không cần worktree.

Topics: Coding Agents, Dev Tools, Workflow, Skills

Canonical: https://homus.dev/talks/agentic-git-with-gitbutler-parallel-branches-with-multiple-agents

## 1. GitButler cho agentic workflow

Scott Chacon giới thiệu mình là CEO của GitButler. Video này là tập mở màn của một loạt video về cách dùng GitButler trong agentic workflow. Lời mời của anh khá thẳng: nếu bạn đang dùng agent để làm software development, thì GitButler là một công cụ rất hợp với workflow đó.

![Scott Chacon nói trước camera, bên trái là thẻ Parallel branches and smarter git tools for your agents](https://homus.dev/photos/pXPTPr91Xew-0043.jpg)

Thẻ mở đầu của video: "Parallel branches and smarter git tools for your agents", kèm logo và địa chỉ gitbutler.com.

Theo Scott, GitButler làm được vài thứ mà Git thuần, Jujutsu hay các công cụ tương tự không làm. Thứ nhất, nó được build riêng để cung cấp tool cho agent. Vì vậy nó rất giỏi ở những thao tác phức tạp, kiểu những việc mà bình thường bạn phải làm bằng interactive rebase và các kỹ thuật tương tự.

## 2. Parallel branches: nhiều việc trong một working directory

Nhưng trọng tâm của video là một tính năng tên là **parallel branches**. Ý tưởng là làm việc trong **một** working directory, trên nhiều thứ cùng một lúc, và đưa cho agent của bạn tool để làm được như vậy. Nhờ thế bạn không phải quản lý nhiều worktree riêng rẽ.

Scott hứa sẽ cho xem ba thứ: làm sao để dùng nó, làm sao để set up, và làm sao để làm những việc thật sự phức tạp mà theo anh lại rất đơn giản khi dùng GitButler cùng agent.

Ý chính của video: thay vì phải tung hứng nhiều worktree, các agent cùng làm trong một thư mục, còn GitButler chia thay đổi của từng agent vào branch riêng.

## 3. Cài GitButler và CLI but

Việc trước hết dĩ nhiên là tải GitButler nếu bạn chưa có. Bạn vào gitbutler.com, ở đó có hai lựa chọn: cài qua CLI ngay trên trang, hoặc tải bản desktop rồi cài CLI riêng. Cách nào thì bạn cũng có một lệnh CLI mới tên là `but`. Với lệnh này, bạn có thể dạy cho agent một skill về cách dùng GitButler để làm những việc phức tạp sắp được trình diễn.

![Trang chủ gitbutler.com với tiêu đề Version Control for your Agents và nút Get the But CLI](https://homus.dev/photos/pXPTPr91Xew-0103.jpg)

Trang chủ GitButler với khẩu hiệu "Version Control for your Agents", hai tab CLI và Desktop, nút "Get the But CLI" có lệnh cài bằng curl, và một khung minh hoạ các lệnh `but branch new`, `but commit`.

Trên trang chủ lúc quay video (09/2026), GitButler ghi rằng agent nhanh hơn khoảng 60% và dùng ít hơn 80% tool call khi dùng GitButler so với Git thuần, và trỏ tới benchmark ở vcbench.dev. Theo trang docs của GitButler, đây là benchmark do chính họ chạy, nên họ công khai bộ task, bộ chấm điểm và toàn bộ kết quả để mọi người tự kiểm. Lệnh cài trên nút "Get the But CLI" là:

```
curl -fsSL https://gitbutler.com/install.sh | sh
```

## 4. but agent setup: dạy skill cho mọi agent harness

Khi đã có lệnh `but`, bạn vào command line và gõ:

```
but agent setup
```

Lệnh này mở một wizard. Nó nói với bạn, đại ý: đây là các agent harness mà tôi thấy bạn đang dùng, bạn muốn tôi cài skill cho tất cả, hay chỉ cho một vài cái? Bạn tự chọn. Bạn cũng chọn được phạm vi: áp cho mọi project, hay chỉ cho project đang đứng. Scott chọn cài global.

![Wizard but agent setup trong terminal với danh sách agent, phạm vi và preferences](https://homus.dev/photos/pXPTPr91Xew-0143.jpg)

Wizard `but agent setup`: bước 1 dò ra các agent đang có trên máy (Codex, Claude Code, Cursor, GitHub Copilot, OpenCode), bước 2 chọn phạm vi "All my projects (global)", bước 3 là danh sách preferences như gộp các fix nhỏ vào đúng commit, gợi ý tách commit lớn, ưu tiên stacked branch cho việc phụ thuộc nhau, hay commit sau mỗi lượt của agent.

Wizard còn hỏi bạn thích làm việc thế nào. Có cả một loạt cách để bạn nói với nó: đây là cách tôi muốn làm trong project này, hoặc đây là cách tôi muốn làm ở mọi nơi. Bạn áp dụng, và nó cài skill vào khắp các harness đã chọn. Trên màn hình, wizard cũng nói rõ là nó không ghi gì cho tới khi bạn xem lại và xác nhận, và bạn sẽ thấy chính xác những gì thay đổi trước.

Từ đó, khi bạn mở Claude, mở Codex, hay bất cứ harness nào, nó sẽ load skill này và làm được những thao tác version control phức tạp hơn mà video đang nói tới. Scott khuyên làm bước này trước tiên.

## 5. Project mẫu buthub, một bản clone nhỏ của GitHub

Set up xong, Scott chuyển sang một project ví dụ. Kế hoạch là dùng nhiều agent làm nhiều feature cùng lúc trong cùng một working directory. Không có worktree nào cả: các agent chỉ làm trên parallel branch và stacked branch, và người xem sẽ thấy làm một đống việc song song với GitButler trông ra sao.

Project có tên **buthub**, một kiểu clone thay thế cho GitHub. Bạn trỏ nó vào một thư mục trên đĩa và nó cho bạn một giao diện nhỏ khá gọn, giống GitHub. Có tab Code để xem danh sách file, có Issues, có Branches để xem các branch trên server, và có Stats.

![Trang Stats của buthub trước khi sửa, chỉ là danh sách số liệu và loại file](https://homus.dev/photos/pXPTPr91Xew-0243.jpg)

Trang Stats của buthub lúc ban đầu, chạy ở localhost cổng 3000: vài con số (10 commits, 29 tracked files, 1 contributor), một contributor demo, và mục "File types" chỉ là danh sách đếm theo đuôi file (rs 15, md 10...).

Việc tiếp theo là cải thiện app này và thêm feature, làm song song bằng parallel branches và stacked branches.

## 6. Ba agent, hai harness, ba việc cùng lúc

Scott đã mở sẵn ba agent: hai phiên Claude Code và một Cursor agent. Cả ba sẽ làm trong cùng một thư mục, cùng một lúc, trên ba việc khác nhau, để xem chúng dùng GitButler quản lý công việc ra sao.

![Ba ô terminal xếp chồng: hai phiên Claude Code và một Cursor Agent, cùng thư mục repo](https://homus.dev/photos/pXPTPr91Xew-0323.jpg)

Ba ô terminal cùng trỏ vào một thư mục repo: hai phiên Claude Code ở trên và giữa, Cursor Agent ở dưới. Dòng trạng thái của Cursor cho thấy nó đang ở workspace của GitButler.

Việc thứ nhất giao cho Claude: thêm dark mode cho site. Câu Scott gõ vào ô trên cùng:

```
Add dark mode to the site
```

Việc thứ hai giao cho Cursor ở ô dưới: thay mục "file types" trên trang stats bằng một thanh trạng thái có mã màu:

```
Instead of having the file types as counts, make it a color coded status bar at the top of the stats page.
```

Việc thứ ba là thêm một bộ render Markdown: nếu repo có README thì render nó thành Markdown. Scott đoán việc này "hy vọng là" sẽ thành một stacked branch. Hai việc còn lại là dark mode và trang stats. Anh nhắc lại: đây là hai harness khác nhau, ba instance, tất cả trong một working directory, làm ba việc hoàn toàn khác nhau, và câu hỏi là chúng dùng tooling thế nào để mọi thứ ăn khớp.

Ở một ô khác, Scott để chạy một tool theo dõi trạng thái workspace. Ngay khi agent bắt đầu sửa file, bạn đã thấy file hiện lên ở đó. Tool này cho thấy agent tạo branch, stack branch, commit và quản lý mọi thứ ra sao, nhưng tất cả vẫn nằm trong một working directory.

## 7. Xem agent làm việc: dark mode, toggle và stats

Scott quay lại site xem đã có dark mode chưa, và phải chạy lại server. Hoá ra phiên dark mode đã xong ở ô dưới cùng của nó. Nhưng trên trang không có nút bật tắt nào, và anh không biết bật dark mode lên kiểu gì. Thế là anh gõ thêm cho agent đó:

```
add an inpage toggle
```

![Terminal của ba agent bên trái và trang stats mới có thanh màu bên phải](https://homus.dev/photos/pXPTPr91Xew-0443.jpg)

Bên trái, agent dark mode báo đã chạy test pass và commit vào một branch mới tên dark-mode (chưa push), rồi nhận yêu cầu thêm toggle; Cursor ở dưới báo đã làm thanh màu theo tỉ lệ đuôi file kèm chú thích và cả 6 test stats đều pass. Bên phải là trang Stats với thanh màu mới ở trên cùng.

Phiên stats vẫn đang chạy, nhưng Scott thấy phần thanh màu làm khá ổn. Anh tiện tay bảo nó làm đẹp nốt phần còn lại:

```
ok, make the rest of the stats more pretty too
```

Anh nói vui: xem nó làm được gì, có khi được, có khi không, ai mà biết. Tới đó phiên Cursor đã xong việc đầu nên được giao thêm việc, còn phiên dark mode vẫn đang làm toggle.

![Agent dark mode nhận ra một agent khác vừa thêm module markdown và kiểm workspace bằng but diff](https://homus.dev/photos/pXPTPr91Xew-0502.jpg)

Một chi tiết của làm việc song song: agent dark mode nhận ra "một agent khác vừa thêm markdown module trong lúc tôi đang làm", nên kiểm trạng thái workspace bằng `but diff` trước khi động vào gì. Ô dưới là câu Scott vừa gõ cho Cursor.

Kiểm lại những gì đã có: đã có một branch dark mode riêng, có commit. Commit render Markdown cũng đã xong.

## 8. Commit không deterministic, và mỗi harness theo skill một kiểu

Phần stats thì chưa xong, hoặc ít nhất là chưa được commit. Scott nói có thể phải nhắc nó dùng GitButler. Việc này không deterministic: có lúc agent commit ở cuối lượt, có lúc không. Anh thích để agent commit ở cuối mỗi lượt để sau này dọn lại cho gọn. Câu anh gõ cho Cursor:

```
always commit with gitbutler when youre done
```

Anh cũng thấy một điều thú vị: các harness khác nhau theo skill theo những cách khác nhau. Đội GitButler đã cố tối ưu skill cho từng harness, nhưng dù sao skill vẫn có đủ khả năng để làm những việc khó nếu agent muốn.

![Agent chạy but diff với short code để xem hunk thuộc về ai](https://homus.dev/photos/pXPTPr91Xew-0603.jpg)

Ô trên: agent dark mode thấy agent kia vừa sửa stylesheet giữa chừng, đoạn nó chèn vào rơi vào giữa rule mới của agent kia, nên tự kiểm và sửa lại. Ô giữa: agent markdown báo một test không liên quan bị fail vì thuộc phần stats đang làm dở trong working tree. Ô dưới: Cursor chạy `but diff` với một short code để xem hunk.

Bạn thấy agent chạy `but diff`, `but show`, dùng các short code để tự hỏi: hunk này thuộc về đâu? Đây có phải của mình không? Mình có được commit nó không? Scott để chúng chạy thêm một lúc xem kết cục ra sao.

## 9. Bốn branch, hai stack, vẫn một thư mục

Trên tool theo dõi đã thấy agent commit phần dark mode vào một branch riêng. Nó cũng commit bộ render Markdown vào branch riêng của nó, rồi stack phần README (thứ dùng tới bộ render đó) lên trên.

![Giao diện but tui với các branch readme-on-repo-page, markdown-rendering, dark-mode trên common base](https://homus.dev/photos/pXPTPr91Xew-0623.jpg)

Giao diện terminal của GitButler lúc giữa chừng: trên cùng là các file stats chưa commit; branch readme-on-repo-page được stack trên markdown-rendering; dark-mode là branch riêng; tất cả cùng đi ra từ một common base.

Thứ còn thiếu là phần stats. Khi nó xong, Scott muốn xem Cursor có tự tạo được stack thứ ba của riêng nó và commit vào đó không. Khi ấy về cơ bản sẽ có bốn branch: hai cái stack lên nhau, hai cái độc lập.

Bạn có thể mở PR cho từng branch một cách độc lập, merge theo bất kỳ thứ tự nào. Và Scott nhấn lại, tất cả làm trong một working directory, thay vì phải có một đống worktree hay một đống thứ phải tung hứng.

## 10. Kết quả trên site: theme sáng tối, README và trang stats mới

Xem lại thì mọi thứ dường như đã chạy tới cuối và đều đã được commit. Trước khi đi vào danh sách file thay đổi, Scott khởi động lại server để xem thành quả.

![buthub ở chế độ tối với bộ chọn Theme Auto Light Dark và mục README.md bên dưới danh sách file](https://homus.dev/photos/pXPTPr91Xew-0704.jpg)

buthub sau khi ba agent làm xong: bộ chọn Theme (Auto, Light, Dark) ở góc trên, giao diện tối, và mục README.md giờ hiện ngay dưới danh sách file. Bên trái là bốn branch đã commit.

Giờ đã có theme sáng và tối. README cũng được render đúng thành Markdown, và chỉ hiện ra khi repo có README.

![Trang Stats mới với thanh màu, ba ô số liệu và thanh contributor](https://homus.dev/photos/pXPTPr91Xew-0723.jpg)

Trang Stats mới: thanh màu theo loại file ở trên, ba ô số liệu lớn (commits, tracked files, contributor), và thanh tỉ lệ commit của contributor, so với danh sách chữ đơn điệu lúc đầu.

Còn trang stats thì đẹp hơn trước rất nhiều: không chỉ có thanh màu, mà cả trang trông khác hẳn. Agent đã làm đủ mọi thứ được yêu cầu, và cả ba feature đều đã được tích hợp.

## 11. Agent tự thấy dependency và stack branch

Tiếp theo Scott xem các commit được tạo ra. Điểm thú vị: có ba agent làm ba việc, là trang stats, dark mode, và bộ Markdown cùng README. Một agent đã stack các branch của nó: một branch là bộ render Markdown, branch kia là phần README dùng bộ render đó. Như vậy là rất hợp lý cho một stacked branch.

Scott vốn đoán sẽ có một stack hai branch và hai branch song song độc lập. Thực tế khác: agent thấy trang stats phụ thuộc vào dark mode. Thay vì bị kẹt, nó tự nhủ, đại ý: đây là một dependency, vậy mình stack phần UI trang stats lên trên dark mode. Hơn nữa, nó còn nhận ra phần UI trang stats đã có sẵn sẽ không chạy đúng, nên viết lại phần đó trên nền dark mode.

![but tui với stats-page-ui stack trên dark-mode và readme-on-repo-page stack trên markdown-rendering](https://homus.dev/photos/pXPTPr91Xew-0803.jpg)

Trạng thái cuối: không còn thay đổi chưa commit; stats-page-ui ("redesign the stats page with charts instead of plain...") stack trên dark-mode ("add dark mode with a CSS-only theme toggle"), còn readme-on-repo-page stack trên markdown-rendering.

Đó là chỗ thú vị khi dùng nhiều agent, hay làm việc song song trong một working directory với GitButler: theo Scott, nó khá thông minh trong việc nhận ra "ở đây có dependency", rồi stack các branch lại, thay vì không làm được, hoặc dồn nhiều commit vào cùng một branch. Anh nói đây là một trong những điều anh thích nhất khi dùng GitButler cho agentic work, nhất là với nhiều agent làm song song trong một thư mục: nó rất giỏi tách, squash, di chuyển và stack các thay đổi.

## 12. Pull request độc lập, merge theo thứ tự nào cũng được

Scott nói còn có thể bảo agent stack tất cả lại thành một stack lớn gồm bốn branch. Nhưng với cấu trúc vừa có, nếu mở pull request ngay, bạn sẽ thấy có hai cặp: hai branch của stack này merge cùng nhau, hai branch của stack kia merge cùng nhau, và mỗi cặp có thể merge trước hay sau tuỳ ý. Kết quả cuối cùng là đúng những gì đang có trong working directory. Theo mô tả video của GitButler, các pull request độc lập này được đảm bảo merge sạch, và cách làm này không có đường nào tạo ra merge conflict.

Bốn branch thành hai stack trên cùng một common base; mỗi stack mở pull request riêng và có thể merge trước hay sau stack kia.

Scott tóm lại: đó là agentic work với GitButler, chạy song song bằng nhiều agent, kể cả các harness khác nhau, trong một working directory, và kết thúc với nhiều branch song song và stacked branch mà bạn merge theo thứ tự nào, cách nào tuỳ thích.

Lời khuyên cuối của anh: nếu bạn muốn làm việc song song mà không phải tung hứng worktree, hãy tải GitButler, chạy `but agent setup`, cài skill GitButler, rồi để agent lo hoàn toàn chuyện version control cho bạn, hoàn toàn trong một thư mục, song song. Anh cảm ơn người xem.

## Nguồn và liên kết

- Tên gốc: Agentic Git with GitButler: Parallel branches with multiple agents.
- Sự kiện: [YouTube](https://homus.dev/events/youtube)
- Video gốc: [https://www.youtube.com/watch?v=pXPTPr91Xew](https://www.youtube.com/watch?v=pXPTPr91Xew)

- Kênh YouTube GitButler (Scott Chacon): [youtube.com/channel/UCEwkZIHGqsTGYvX8wgD0LoQ](https://www.youtube.com/channel/UCEwkZIHGqsTGYvX8wgD0LoQ)

- GitButler, trang chủ và lệnh cài CLI but: [gitbutler.com](https://gitbutler.com/)

- GitButler Docs, AI Agents Overview (lệnh `but agent setup`, parallel branches trong một workspace): [docs.gitbutler.com/ai-agents/overview](https://docs.gitbutler.com/ai-agents/overview)

- GitButler Docs, Parallel agents (khi nào dùng GitButler thay cho worktree riêng): [docs.gitbutler.com/ai-agents/parallel-agents](https://docs.gitbutler.com/ai-agents/parallel-agents)

- GitButler Docs, Tuning agent behavior (các preferences trong wizard): [docs.gitbutler.com/ai-agents/tuning-agent-behavior](https://docs.gitbutler.com/ai-agents/tuning-agent-behavior)

- [vcbench.dev](https://vcbench.dev), benchmark version control cho agent do GitButler công bố: [vcbench.dev](https://vcbench.dev)

- Mã nguồn GitButler: [github.com/gitbutlerapp/gitbutler](https://github.com/gitbutlerapp/gitbutler)

Nguồn: https://homus.dev/talks/agentic-git-with-gitbutler-parallel-branches-with-multiple-agents · cập nhật 2026-10-20
