Khóa học
Các nhánh trong Git đại diện cho các dòng phát triển độc lập, cho phép nhà phát triển làm việc song song trên nhiều tính năng hoặc phiên bản của một dự án.
Nhánh Git cung cấp cách có cấu trúc để quản lý thay đổi mã, cho phép tích hợp mượt mà các tính năng mới, bản sửa lỗi và ý tưởng thử nghiệm mà không làm gián đoạn mã nguồn chính.

Trước đây, chúng ta dùng lệnh git checkout để di chuyển giữa các nhánh. Tuy nhiên, lệnh checkout cho phép làm nhiều việc hơn là chỉ đổi nhánh, dễ gây nhầm lẫn và có thể dẫn đến sai sót.
Được giới thiệu trong Git 2.23 vào tháng 8/2019, lệnh git switch mang đến cách trực quan hơn để chuyển và tạo nhánh mới.
Chuyển và tạo nhánh với Git Switch
Trong các dự án phức tạp, ưu tiên thay đổi liên tục và quy trình làm việc thường không tuyến tính. Thông thường, mỗi nhánh tập trung vào các thay đổi cụ thể, cho phép chúng ta đồng thời triển khai nhiều tính năng mới hoặc bản sửa lỗi, mỗi phần trên nhánh riêng của nó.
Có nhiều lý do khiến chúng ta cần tạm dừng một tính năng và chuyển sang nhánh khác, chẳng hạn như:
- Đang chờ đánh giá mã (code review).
- Gặp bế tắc và cần đồng nghiệp hỗ trợ.
- Xử lý một hotfix cần ưu tiên ngay.
Chuyển nhánh hiệu quả là chìa khóa để giữ cho phát triển trơn tru và đảm bảo các thay đổi được đưa vào đúng nơi. Với nhiều đầu việc và sự phối hợp trong nhóm, có một cách chuyển nhánh đơn giản và đáng tin cậy là rất quan trọng.
Để chuyển sang một nhánh đã tồn tại bằng lệnh switch, chúng ta làm như sau:
git switch <branch-name>
Trong lệnh trên, <branch_name> cần được thay bằng tên nhánh muốn chuyển tới. Giả sử chúng ta muốn làm việc trên một tính năng mới nằm ở nhánh feature-x đã tồn tại, khi đó ta dùng lệnh:
git switch feature-xTìm tên các nhánh hiện có
Nếu muốn liệt kê các nhánh hiện có, chúng ta dùng lệnh git branch. Nhánh hiện tại sẽ được đánh dấu bằng dấu hoa thị. Ví dụ, nếu có ba nhánh cục bộ tên là main, feature-x và bug-z, và chúng ta đang ở nhánh main, đầu ra sẽ là:
* main
feature-x
bug-z
Chuyển sang một nhánh remote
Lệnh trước cho phép chúng ta đổi sang nhánh đã có trên máy cục bộ. Để chuyển sang nhánh từ kho remote, cần tạo một bản cục bộ của nhánh đó bằng lệnh sau:
git switch -c <local-branch-name> origin/<remote-branch-name>
Ở đây, <local-branch-name> là tên muốn đặt cho nhánh trên máy cục bộ, còn <remote-branch-name> là tên nhánh trên remote. Thông thường, ta dùng cùng một tên để tránh nhầm lẫn. Giả sử chúng ta chưa có nhánh feature-x cục bộ. Khi đó có thể tạo bản cục bộ và chuyển sang nhánh đó như sau:
git switch -c feature-x origin/feature-x
Khi dùng cùng tên, Git cung cấp cách viết tắt với tùy chọn --track. Vì vậy lệnh trên tương đương với:
git switch --track origin/feature-x
Để liệt kê các nhánh remote, chúng ta có thể dùng lệnh git branch -r.
Kho cục bộ không tự động theo dõi các nhánh remote. Do đó, trước khi liệt kê hoặc chuyển sang một nhánh remote, cần cập nhật kho cục bộ bằng git fetch.
Tạo nhánh mới và chuyển sang nhánh đó
Chúng ta muốn tạo một nhánh hoàn toàn mới để bắt đầu tính năng mới. Trong trường hợp này, có thể dùng cờ -c:
git switch -c <new-branch-name>
Thay <new-branch-name bằng tên nhánh. Ví dụ, để tạo nhánh tên feature-y, ta làm như sau:
git switch -c feature-y
Chuyển lại về nhánh trước đó
Thường thì sau khi chuyển nhánh để làm một việc, chúng ta muốn quay lại nhánh làm việc trước đó. Git cung cấp cách viết tắt bằng lệnh:
git switch -
Git Switch và Git Checkout
Lệnh git checkout đã có trong Git từ đầu. Trước khi git switch xuất hiện vào năm 2019, git checkout được dùng để đổi giữa các nhánh. Tuy nhiên, phạm vi của git checkout vượt quá việc chỉ điều hướng giữa nhánh. Dưới đây là khác biệt:
git switch: Nhằm mang đến cách trực quan hơn để chuyển và tạo nhánh mới. Mục tiêu là đơn giản hóa tập lệnh và giảm nhầm lẫn.git checkout: Lệnh linh hoạt hơn, có thể dùng để chuyển nhánh, đồng thời checkout tệp và khôi phục nội dung từ các commit hoặc nhánh khác.
Thiết kế của git switch giúp khó vô tình ghi đè thay đổi hơn. Cú pháp rõ ràng hơn cho việc chuyển nhánh và tạo nhánh mới.
Vì git checkout làm nhiều việc (chuyển nhánh, khôi phục tệp, v.v.), nên khả năng mắc lỗi khi sử dụng cao hơn.
Git Switch: Lỗi thường gặp
Khi quản lý nhánh, bạn có thể gặp vài vấn đề phổ biến. Một trong số đó là cố tạo một nhánh đã tồn tại trên máy cục bộ. Một vấn đề khác thường gặp là cố chuyển nhánh khi có thay đổi chưa commit. Hãy bắt đầu với vấn đề đầu tiên.
Nhánh đã tồn tại cục bộ
Mỗi nhánh cục bộ cần một tên duy nhất. Bạn có thể dùng git switch để tạo nhánh cục bộ theo hai cách:
1. Theo dõi một nhánh remote:
git switch --track origin/<branch-name>
2. Tạo một nhánh cục bộ mới:
git switch -c <branch-name>
Trong cả hai trường hợp, nếu đã có nhánh cục bộ tên <branch-name>, Git sẽ báo lỗi:
fatal: a branch named '<branch-name>' already exists

Trong trường hợp này, chúng ta có thể chuyển sang nhánh đó mà không cần tạo mới bằng git switch <branch-name>.
Nhánh hiện tại có thay đổi chưa commit
Git sẽ không cho phép đổi nhánh nếu nhánh hiện tại có các thay đổi chưa commit sẽ bị ghi đè khi chuyển. Khi đó, Git sẽ báo lỗi:
Please commit your changes or stash them before you switch branches.

Như thông báo nêu rõ, để xử lý tình huống này, chúng ta cần hoặc commit thay đổi trước, hoặc stash chúng lại. Nếu thay đổi đã sẵn sàng để đưa vào kho, chúng ta nên commit bằng:
git commit -m "Commit message"
Nếu muốn giữ thay đổi nhưng chưa sẵn sàng commit, ta có thể tạm lưu bằng lệnh git stash:
git stash
Nếu chúng ta stash thay đổi trước khi chuyển nhánh và muốn áp dụng lại khi quay về nhánh gốc, có thể dùng lệnh git stash pop.
Ngoài ra, chúng ta cũng có thể quyết định loại bỏ thay đổi bằng cờ --discard-changes:
git switch --discard-changes <branch-name>
Hãy cẩn trọng khi dùng tùy chọn sau vì các thay đổi sẽ bị xóa vĩnh viễn.
Sử dụng nâng cao với Git Switch
Khi cần tạo nhánh từ những điểm cụ thể trong lịch sử dự án hoặc xử lý các tình huống đặc biệt, git switch cung cấp các chức năng nâng cao để đáp ứng nhu cầu này.
Tách nhánh từ một điểm cụ thể
Theo mặc định, khi tạo nhánh bằng git switch, trạng thái khởi đầu của nhánh mới sẽ là HEAD của nhánh hiện tại.

Hãy hình dung chúng ta muốn bắt đầu một nhánh mới từ một commit trước đó cụ thể. Mỗi commit được nhận diện bằng một <hash> duy nhất, có thể dùng với lệnh git switch để tạo nhánh mới từ commit đó. Cách thực hiện như sau:
switch -c feature-y <hash>
Thay <hash> bằng mã băm (hash) commit thực tế.

Chuyển sang detached HEAD
Nếu muốn khám phá hoặc thử nghiệm với một commit cụ thể mà không ảnh hưởng đến nhánh hiện tại hoặc tạo nhánh mới, chúng ta có thể dùng detached HEAD với lệnh:
git switch --detach <hash>

Bằng cách tách HEAD, chúng ta có thể an toàn kiểm tra trạng thái của kho tại một commit cụ thể, chạy kiểm thử, hoặc thực hiện thay đổi tạm thời mà không lo các thay đổi đó bị commit nhầm vào nhánh làm việc hiện tại. Các trường hợp sử dụng phổ biến gồm:
- Xem trạng thái cũ: Nếu muốn kiểm tra hoặc thử nghiệm một commit cũ hơn mà không thay đổi nhánh hiện tại, ta có thể chuyển sang commit đó ở trạng thái detached.
- Thay đổi tạm thời: Nếu muốn thử nghiệm các thay đổi mà không ảnh hưởng tới bất kỳ nhánh nào, có thể thực hiện trong trạng thái detached HEAD. Lưu ý mọi commit mới trong trạng thái này sẽ không thuộc bất kỳ nhánh nào, và có thể cần tạo nhánh mới nếu muốn giữ các commit đó.
- Mục đích build/test: Đôi khi chúng ta cần build hoặc kiểm thử phần mềm tại một commit cụ thể. Chuyển sang trạng thái detached HEAD tại commit đó cho phép thực hiện mà không ảnh hưởng cấu trúc nhánh của kho.
Buộc chuyển nhánh
Chúng ta đã biết Git sẽ không cho phép đổi nhánh nếu có thay đổi chưa commit có thể xung đột với nhánh đích. Nếu chắc chắn muốn loại bỏ các thay đổi đó và tiếp tục chuyển nhánh, có thể buộc thực hiện với tùy chọn -f, như sau:
git switch -f <branch-name>
Có một số lưu ý quan trọng.
- Mọi thay đổi chưa commit sẽ bị mất mà không có cảnh báo, có thể dẫn tới mất công sức nếu chưa lưu ở nơi khác.
- Dùng
-fbừa bãi có thể tạo thói quen xấu, khuyến khích bỏ qua các thực hành quản lý phiên bản đúng đắn như stash hoặc commit các thay đổi đang làm dở (WIP). Điều này có thể làm lịch sử kho lộn xộn và gây khó khăn cho cộng tác. Vì vậy, dùgit switch -fnhanh và tiện, hãy dùng một cách thận trọng và hiểu rõ rủi ro để giảm thiểu hệ quả.
Kết luận
Lệnh git switch giúp việc chuyển và tạo nhánh dễ dàng hơn so với lệnh git checkout cũ.
Nó đơn giản hóa quy trình và giảm sai sót, giúp nhà phát triển quản lý mã nguồn thuận tiện hơn.
Lệnh này giúp tránh các vấn đề thường gặp, như vô tình ghi đè thay đổi hoặc nhầm lẫn giữa các chức năng khác nhau của git checkout.
Áp dụng lệnh này có thể giúp điều hướng các nhánh Git trực quan hơn và tăng cường hợp tác trong nhóm phát triển.
