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.

Nhánh phía trên là main, nhánh phía dưới là feature/new-idea. Sau khi merge, main trỏ đến M, là commit có hai commit cha: E và D.ABEMCD
Nhánh phía trên là main, nhánh phía dưới là feature/new-idea. Sau khi merge, main trỏ đến M, là commit có hai commit cha: E và D.

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:

  1. bạn có một bản thảo hoàn chỉnh (đó là branch chính main);
  2. 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);
  3. 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);
  4. 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);
  5. 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).
Claude Code liên quan thế nào

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.

Widget branch ở góc trên bên trái

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.

Cửa sổ tạo branch mới

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.

Commit trên branch mới
Claude Code liên quan thế nào

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.

Chuyển sang branch main

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.

Tệp không có thay đổi từ branch khác

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.

main di chuyển từ C2 đến C3 mà không tạo commit mớiC1C2C3
main di chuyển từ C2 đến C3 mà không tạo commit mới

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ụ.

Thực hiện merge các branch

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.

Merge thành công

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.

Hai branch có chung commit tổ tiên C1C1C2C3
Hai branch có chung commit tổ tiên C1

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:

  1. đảm bảo bạn đang ở branch main và không có thay đổi chưa commit hay tệp mới nào trong cửa sổ Commit;
  2. 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;
  3. vẫn ở branch main, đổi dòng đầu tiên trong README.md thành "My Awesome Project" rồi tạo commit;
  4. chuyển sang branch feature/new-title. Bạn sẽ thấy dòng đầu tiên trong README.md vẫ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ạo commit;
  5. quay lại branch main và merge với feature/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).

Cửa sổ thông báo xung đột

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.
Cửa sổ giải quyết xung đột ba chiều

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.

Claude Code liên quan thế nào

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ụ:

  1. bạn có một commit bất kỳ trên branch main (giả sử là C1);
  2. bạn tạo commit mới trên branch main với nội dung "My Awesome Project". Lúc này branch main trỏ đến commit C2;
  3. bạn tạo branch feature/new-title từ vị trí hiện tại của main - branch mới cũng bắt đầu từ commit C2;
  4. bạn tạo commit trên feature/new-title với nội dung "My Super Project". Branch này tiến lên và trỏ đến commit C3;
  5. bạn quay lại main (vẫn ở commit C2) rồi merge feature/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.

main di chuyển từ C2 đến C3 mà không tạo commit mớiC1C2C3
main di chuyển từ C2 đến C3 mà không tạo commit mới

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.

Cửa sổ Git Log

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.

Claude Code liên quan thế nào

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).
Claude Code liên quan thế nào

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