Branch giúp bạn phát triển song song nhiều hướng trong cùng một dự án mà không cản trở lẫn nhau. Trong bài viết này, bạn sẽ hiểu branch là gì và vì sao cần dùng, học cách tạo branch, chuyển qua lại, merge thay đổi và bình tĩnh xử lý xung đột merge bằng công cụ IDE. Đây là nền tảng cần thiết để hiểu Claude Code làm gì khi thao tác với repository trong một branch riêng.
Ví dụ và ảnh chụp giao diện dùng IDE JetBrains; tên và vị trí thao tác có thể khác tùy phiên bản. Hãy làm bài thực hành trên một repository riêng dùng để luyện tập. Với dự án đang làm, hãy tuân theo quy tắc về branch, commit và gửi thay đổi của dự án đó.
Branch là gì và dùng để làm gì
Branch đặt tên cho một nhánh commit riêng. Tạo branch không sao chép thư mục dự án và cũng không lưu các tệp chưa commit. Trong thư mục làm việc thông thường, khi chuyển branch, Git thay đổi các tệp để khớp với branch đã chọn; những thay đổi chưa hoàn tất có thể đi theo bạn hoặc khiến việc chuyển branch bị chặn.
Từ branch chính main tách ra branch mới feature/new-idea để phát triển theo hướng riêng. Khi hoàn tất, branch này được merge trở lại main.
Hãy tưởng tượng bạn muốn sửa lớn một phần trong dự án hoặc thử nghiệm một thay đổi có rủi ro. Nếu không có Git, bạn sẽ làm gì? Có lẽ bạn sẽ sao chép cả dự án sang một thư mục mới rồi làm việc ở đó. Nếu thích kết quả, bạn chuyển nó sang thư mục chính. Nếu không, bạn chỉ cần xóa bản sao.
Ví dụ về bản sao giúp hình dung các hướng làm việc riêng, nhưng về mặt kỹ thuật, branch là một con trỏ đến commit. Hãy xem qua ví dụ về một cuốn sách:
- bạn có một bản thảo hoàn chỉnh (đó là branch chính
main); - bạn muốn viết một đoạn kết khác (tạo branch mới, chẳng hạn
feature/new-idea); - bạn viết đoạn kết mới mà không đụng đến nội dung chính của bản thảo (làm việc trên branch mới);
- nếu đoạn kết mới hay hơn, bạn thay đoạn cũ bằng đoạn mới (merge các branch bằng
merge); - bạn có thể xóa bản nháp cũ với đoạn kết không còn cần thiết (xóa branch).
Trước tiên, hãy yêu cầu Claude Code hiển thị branch hiện tại và các thay đổi đang có. Chỉ tạo branch riêng nếu điều đó phù hợp với quy tắc của dự án. Các commit đã lưu tạo điểm để quay lại; riêng việc xóa tên branch không hoàn tác các chỉnh sửa tệp và không khôi phục trạng thái ban đầu.
Tạo branch mới và làm việc trên đó
Bước 1. Mở menu quản lý branch.
Trên thanh công cụ chính, cạnh tên dự án có widget hiển thị tên branch hiện tại (mặc định là main). Nhấp vào đó rồi chọn + New Branch.

Bước 2. Đặt tên branch mới.
Nên đặt tên branch theo công việc bạn đang thực hiện. Chẳng hạn: feature/add-usage-examples.

Nếu chọn Checkout branch khi tạo branch, IDE sẽ chuyển sang branch mới. Hãy kiểm tra tên branch trên widget trước khi sửa tệp.
Bước 3. Thực hiện thay đổi và commit.
Thêm một mục ví dụ sử dụng vào README.md. Xem lại thay đổi rồi commit như bình thường: một ảnh chụp đã lưu sẽ xuất hiện trong lịch sử của branch mới.

Khi Claude Code đề xuất tạo commit, nó làm đúng việc đó: ghi lại các thay đổi hiện tại thành một điểm để sau này bạn có thể quay lại. Trước khi đồng ý, hãy đọc thông điệp commit. Thông điệp này mô tả nội dung thay đổi và bạn có thể dễ dàng chỉnh sửa.
Chuyển đổi giữa các branch
Các thay đổi kèm ví dụ sử dụng hiện đã được lưu an toàn trên branch feature/add-usage-examples. Hãy quay lại branch chính main và xem ở đó có gì.
Bước 1. Nhấp lại vào widget hiển thị tên branch hiện tại ở góc trên bên trái.
Bước 2. Trong danh sách Local hoặc Recent, chọn branch main, rồi nhấp Checkout trong menu phụ hiện ra.

Bước 3. Kiểm tra kết quả.
Sau khi chuyển branch, hãy mở tệp README.md. Bạn sẽ thấy mục ví dụ sử dụng không còn ở đây - nó vẫn nằm trên branch kia. Nhờ vậy, bạn có thể phát triển tính năng mới mà không ảnh hưởng đến phiên bản ổn định trên branch main.

Merge các branch
merge kết hợp lịch sử của branch được chọn với branch hiện tại. Nếu main chưa tiến lên kể từ lúc tách branch, có thể fast-forward: main sẽ di chuyển đến C3 mà không tạo commit mới. Nếu lịch sử hai bên đã rẽ nhánh, merge thông thường sẽ tạo commit có hai commit cha.
Trong trường hợp lịch sử tuyến tính như hình, main có thể di chuyển đến C3. Hiện tại, branch feature/add-usage-examples cũng trỏ đến C3; không cần xóa tên branch để merge.
Vậy là bạn đã hoàn thành công việc trên branch feature/add-usage-examples và muốn đưa các thay đổi đó vào dự án chính.
Bước 1. Chuyển sang branch đích.
Hãy chắc chắn bạn đang ở branch mà bạn muốn đưa thay đổi VÀO. Trong ví dụ này, đó là main.
Bước 2. Thực hiện merge.
Nhấp lại vào widget quản lý branch. Trong danh sách, chọn branch mà bạn muốn lấy thay đổi TỪ đó (feature/add-usage-examples), rồi chọn Merge 'feature/add-usage-examples' into 'main' trong menu phụ.

Bước 3. Kiểm tra kết quả.
Giờ đây, mục ví dụ mới đã xuất hiện trong tệp README.md trên branch main. Bạn đã merge thành công phần việc của mình vào phiên bản chính của dự án.

Xung đột khi merge
Xung đột xảy ra khi Git không thể tự động kết hợp các thay đổi. Trường hợp thường gặp là mỗi bên sửa cùng một dòng theo cách khác nhau; cũng có thể một branch xóa tệp còn branch kia sửa tệp đó. Cách giải quyết tùy thuộc vào kết quả bạn cần.
Đây là lúc các công cụ tích hợp trong IDE (CLion hoặc IntelliJ IDEA) phát huy tác dụng. Giải quyết xung đột trong terminal khá vất vả, nhưng công cụ merge ba chiều (3-way merge) tích hợp giúp bạn xử lý trực quan và đơn giản hơn.
Cả hai branch đều có commit mới dựa trên commit tổ tiên chung C1. Lịch sử rẽ nhánh chưa chắc đã gây xung đột: xung đột chỉ xảy ra khi Git không thể tự kết hợp các thay đổi. Trong bài thực hành dưới đây, hai đoạn văn bản khác nhau sẽ thay thế cùng một dòng ban đầu.
Hãy thử tạo một xung đột:
- đảm bảo bạn đang ở branch
mainvà không có thay đổi chưa commit hay tệp mới nào trong cửa sổ Commit; - tạo branch mới
feature/new-title, nhưng chưa chuyển sang branch đó. Đảm bảo ô Checkout branch không được chọn; - vẫn ở branch
main, đổi dòng đầu tiên trongREADME.mdthành "My Awesome Project" rồi tạocommit; - chuyển sang branch
feature/new-title. Bạn sẽ thấy dòng đầu tiên trongREADME.mdvẫn là nội dung cũ - đó là trạng thái tệp tại thời điểm tạo branch. Đổi chính dòng đó thành "My Super Project" rồi tạocommit; - quay lại branch
mainvà merge vớifeature/new-title.
Giờ Git sẽ phát hiện cả hai nhánh lịch sử đều thay đổi cùng một vị trí. Git sẽ mở cửa sổ để bạn giải quyết xung đột (Merge Conflicts).

Nhấp nút Merge để mở công cụ giải quyết xung đột. Bạn sẽ thấy:
- bên trái (Your changes) - phiên bản tệp trên branch hiện tại của bạn (branch đích,
main); - bên phải (Changes from branch) - phiên bản tệp từ branch bạn đang merge;
- ở giữa (Result) - phiên bản cuối cùng của tệp mà bạn tự ghép lại.

Bạn có thể nhấp các mũi tên >> hoặc << (hoặc dấu X để hủy) để chấp nhận toàn bộ một trong hai phiên bản. Bạn cũng có thể nhập trực tiếp nội dung đúng vào khung ở giữa.
Kiểm tra kết quả ở khung giữa rồi nhấp Apply hoặc nút tương ứng để hoàn tất. Sau đó xem trạng thái Git: nếu merge chưa được commit, hãy tạo commit qua IDE. Giải quyết các dòng xung đột và hoàn tất merge là hai bước riêng. Hãy kiểm tra xem mã sau cùng hoạt động đúng chưa.
Nếu xảy ra xung đột khi làm việc với Claude Code, đó không phải lỗi: Claude có thể dừng lại và nhờ bạn trợ giúp hoặc đề xuất cách gỡ rối các thay đổi. Bạn giải quyết xung đột bằng cùng công cụ ba chiều trong IDE như mọi xung đột khác.
Vì sao đôi khi không có xung đột
Nếu bài thực hành không tạo ra xung đột, hãy kiểm tra branch thứ hai được tạo từ commit nào và hai bên có thực sự thay cùng một dòng theo hai cách khác nhau không. Git có thể tự kết hợp các chỉnh sửa tương thích, ngay cả khi lịch sử đã rẽ nhánh. Một khả năng khác là lịch sử tuyến tính, cho phép fast-forward:
Ví dụ:
- bạn có một commit bất kỳ trên branch
main(giả sử là C1); - bạn tạo commit mới trên branch
mainvới nội dung "My Awesome Project". Lúc này branchmaintrỏ đến commit C2; - bạn tạo branch
feature/new-titletừ vị trí hiện tại củamain- branch mới cũng bắt đầu từ commit C2; - bạn tạo commit trên
feature/new-titlevới nội dung "My Super Project". Branch này tiến lên và trỏ đến commit C3; - bạn quay lại
main(vẫn ở commit C2) rồi mergefeature/new-title.
Git nhận thấy branch main là tổ tiên trực tiếp của branch feature/new-title: lịch sử của main không có commit mới nào trong lúc bạn làm việc trên branch khác. Vì vậy, Git chỉ cần đưa con trỏ main tiến đến commit C3, không phát sinh xung đột.
Lịch sử của feature/new-title nối tiếp trực tiếp lịch sử của main, không có nhánh rẽ, nên Git chỉ tiến con trỏ main lên trước - không có xung đột.
Xem lịch sử thay đổi
Để hiểu rõ hơn những gì đang diễn ra trong dự án, bạn nên xem lịch sử của nó.
Mở cửa sổ công cụ Git (thường là biểu tượng trên thanh bên trái hoặc ở cuối cửa sổ IDE), rồi chọn tab Log hoặc Show Git Log trên thanh công cụ Git. Bạn sẽ thấy biểu đồ tất cả branch và commit. Biểu đồ này giúp bạn dễ dàng theo dõi branch nào được tách ra từ đâu và chúng được merge ở vị trí nào.

Nhấp vào bất kỳ commit nào để xem những thay đổi được đưa vào đó, ai tạo và tạo khi nào. Đúng là một cỗ máy thời gian dành cho mã nguồn của bạn.
Các thay đổi của Claude Code sẽ xuất hiện trong lịch sử này khi được lưu bằng commit thông thường. Trong Git Log, chúng nằm cạnh commit của bạn: bạn có thể mở từng commit và kiểm tra chính xác những gì đã thay đổi.
Claude Code làm việc với branch ra sao
Khi đã hiểu branch, bạn sẽ dễ theo dõi hơn những gì Claude Code làm với repository. Dưới đây là những việc nó có thể hỗ trợ và những điều bạn nên để ý:
- tạo branch riêng nếu công việc và quy tắc dự án yêu cầu;
- đề xuất
commitở những thời điểm quan trọng - bạn đọc diff rồi quyết định chấp nhận hay chỉnh sửa; - giúp tìm commit đã lưu cần thiết và chọn cách quay lại, có tính đến các thay đổi chưa commit;
- khi xảy ra xung đột merge, có thể nhờ bạn trợ giúp - bạn xử lý bằng cùng công cụ IDE;
- có thể chuẩn bị và bình luận về pull request (PR là đề xuất merge branch vào branch chính, chẳng hạn qua GitHub CLI).
Trước khi đồng ý, hãy xem diff - đặc biệt khi Claude đề xuất xóa tệp hoặc thực hiện merge. Như vậy, bạn luôn biết chính xác nội dung nào sẽ được đưa vào lịch sử dự án.
Bài viết trước: Cách làm việc hằng ngày với Git · Bài viết tiếp theo: Pull request từ lúc tạo đến khi merge
GO TO FULL VERSION