Trong một thời gian dài, git checkout đảm nhiệm hầu như mọi việc liên quan đến di chuyển trong kho, chuyển nhánh, khôi phục tệp và xem lại các commit cũ. Sự linh hoạt đó lại tạo ra mơ hồ. Cùng một cú pháp có thể mang nghĩa khác nhau tùy theo ngữ cảnh.
Chỉ một lỗi gõ nhỏ có thể chuyển nhánh trong khi bạn định khôi phục tệp. Một lần xem lịch sử nhanh bằng git checkout <commit-hash> có thể khiến bạn rơi vào trạng thái HEAD tách rời mà không nhận ra. Lệnh thì hoạt động, nhưng đòi hỏi bạn luôn phải ý thức về nhiều hành vi khác nhau của nó.
Đó là lý do Git 2.23 giới thiệu git switch, một lệnh chuyên biệt hơn để xử lý các thao tác với nhánh.
Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách git switch khác với git checkout. Chúng ta cũng sẽ phân tích vị trí của từng lệnh trong quy trình làm việc hiện đại và xem phạm vi của chúng.
Nếu bạn còn khá mới với Git, tôi khuyến nghị học các kiến thức cơ bản trong khóa Introduction to Git của chúng tôi.
Git switch là gì?
git switch là lệnh chuyên dụng được giới thiệu trong Git 2.23 để quản lý việc di chuyển giữa các nhánh và tạo nhánh. Nó giúp việc chuyển nhánh gọn gàng, an toàn và ít lỗi hơn.
Trước khi có nó, các nhà phát triển dùng git checkout để chuyển nhánh. Vấn đề là git checkout xử lý nhiều tác vụ không liên quan:
- Chuyển nhánh
- Khôi phục tệp
- Kiểm tra các commit
Điều này khiến lệnh bị “quá tải” và dễ bị dùng sai.
Git giải quyết bằng cách tách trách nhiệm. git switch giờ đảm nhiệm chuyển và tạo nhánh, còn git restore đảm nhiệm khôi phục tệp. Sự phân tách này giảm mơ hồ và hạ rủi ro thay đổi tệp ngoài ý muốn.
Trong thực tế, git switch branch-name di chuyển con trỏ HEAD hiện tại của bạn đến tên nhánh được chỉ định. Bạn cũng có thể dùng git switch -c new-branch để tạo và chuyển sang nhánh mới.
Cơ chế cốt lõi: Git switch vs checkout
Giờ khi bạn hiểu vì sao git switch ra đời, hãy xem nó thực sự khác git checkout như thế nào ở bên trong.
Quản lý nhánh theo mục đích
Trước Git 2.23, git checkout xử lý cả di chuyển nhánh và khôi phục tệp. Thiết kế đó hoạt động, nhưng trộn lẫn hai khái niệm hoàn toàn khác. Nó di chuyển HEAD, khôi phục tệp và checkout các commit. Tùy cách bạn dùng, nó thao tác với con trỏ HEAD, chỉ mục (index) và thư mục làm việc (working tree).

git switch tập trung hoàn toàn vào việc di chuyển con trỏ HEAD giữa các nhánh. Khi bạn chạy git switch branch-name, Git cập nhật HEAD trỏ tới nhánh đó và điều chỉnh thư mục làm việc cho phù hợp. Vậy nên lệnh này tồn tại chuyên cho việc di chuyển và tạo nhánh. Với git switch và git restore, trách nhiệm được phân chia rõ:
Ví dụ, trước đây để khôi phục tệp, cần: git checkout HEAD -- file.txt. Ngày nay, cách khuyến nghị là: git restore file.txt.
Ở đây, bạn đang khôi phục tệp, không phải di chuyển nhánh. Trong script và tài liệu nhóm, sự phân biệt này cải thiện khả năng đọc và giảm sai sót.
Sự tiến hóa của các lệnh Git
Git 2.23 tách trách nhiệm bằng cách giới thiệu git switch cho các thao tác với nhánh và git restore cho khôi phục tệp.
Trước phiên bản đó, git checkout hoạt động như công cụ đa năng. Nó có thể đổi nhánh, khôi phục tệp, hoặc chuyển đến commit bất kỳ. Tuy nhiên, điều này gây nhầm lẫn, đặc biệt với người mới. Do đó, bằng cách tách lệnh, Git giảm mơ hồ và làm rõ các quy trình thường gặp.
Hành vi HEAD tách rời
Trong Git, HEAD thường trỏ đến một nhánh. Nhánh đó lại trỏ đến commit mới nhất. Khi bạn tạo commit mới, Git đẩy nhánh tiến về phía trước. Đây là quy trình chuẩn.
HEAD tách rời xảy ra khi HEAD trỏ trực tiếp đến một commit thay vì nhánh. Ở trạng thái đó, bạn không còn ở trên nhánh nào. Nếu bạn tạo commit mới, Git vẫn tạo, nhưng không có tên nhánh nào tham chiếu đến nó. Trừ khi bạn tạo nhánh rõ ràng, các commit đó không được tham chiếu và có thể khó tìm về sau.

Khi bạn chạy git checkout <commit-hash>, Git sẽ tự động vào chế độ HEAD tách rời. Git chuyển sang commit đó và tách HEAD mà không yêu cầu xác nhận thêm. Hành vi này là hợp lệ, nhưng dễ dẫn đến chế độ tách rời một cách tự động.
Ngược lại, git switch yêu cầu nêu rõ ràng. Để tách HEAD, bạn phải dùng git switch --detach <commit-hash>. Không có cờ --detach, git switch chỉ hoạt động trên các nhánh. Thiết kế này giảm các trạng thái tách rời ngoài ý muốn và làm quy trình với nhánh an toàn, dễ dự đoán hơn.
Những khác biệt chức năng chính giữa Git switch và checkout
Giờ khi đã bao quát các khác biệt cấp cao giữa hai lệnh, hãy xem xét cú pháp, phạm vi và yếu tố an toàn.
Cú pháp lệnh và tạo nhánh
Để tạo và chuyển sang nhánh mới với git switch, bạn chạy git switch -c <branch-name>. Với git checkout, lệnh tương đương là git checkout -b <branch-name>.
Cả hai đều tạo nhánh mới và chuyển sang nhánh đó, nhưng khác biệt nằm ở mức độ rõ ràng về ý định. Trong git switch, cờ -c báo hiệu trực tiếp rằng bạn đang tạo nhánh, trong khi ở git checkout, -b theo lịch sử nghĩa là “branch” nhưng ít rõ ràng hơn về ý định.
git switch cũng giới thiệu cờ -C: git switch -C <branch-name>. Tác dụng của nó mạnh hơn -c: ép tạo nhánh, hoặc đặt lại nếu đã tồn tại. Hành vi này rõ ràng và tập trung vào nhánh. Trong git checkout, hành vi ép tương tự có tồn tại, nhưng ngữ nghĩa ít tách bạch hơn vì lệnh phục vụ nhiều mục đích.
Phạm vi thao tác
git switch chỉ làm việc với nhánh. Nó không thể khôi phục tệp, bỏ stage thay đổi, hoặc checkout các đường dẫn cụ thể từ commit trước. Về cơ bản, nó không hỗ trợ thao tác cấp tệp.
Ngược lại, git checkout có thể hoạt động ở cấp tệp. Ví dụ, git checkout <commit> -- <file> khôi phục một tệp cụ thể từ một commit trước đó.
Tuy nhiên, tài liệu Git hiện đại gợi ý dùng git restore cho mục đích này. Điểm mấu chốt là git switch cố ý loại trừ việc thao tác tệp để giữ phạm vi hẹp và dễ đoán.
Tính an toàn và gỡ mơ hồ
Một vấn đề phổ biến với git checkout là mơ hồ. Nếu tên nhánh và tên tệp trùng nhau, tùy ngữ cảnh, nó có thể chuyển nhánh hoặc khôi phục tệp. git switch tránh hoàn toàn sự mơ hồ này. Nó chỉ hoạt động trên nhánh. Nếu bạn không cung cấp tên nhánh hợp lệ, Git sẽ báo lỗi rõ ràng thay vì đoán.
git switch cũng cung cấp xử lý lỗi rõ ràng hơn khi thay đổi cục bộ xung đột với nhánh đích. Nếu chuyển nhánh sẽ ghi đè công việc chưa commit, Git dừng thao tác và hiển thị thông báo lỗi trực tiếp, như sau:
-
Nếu nhánh không tồn tại: fatal: invalid reference: feature/login
-
Nếu thay đổi cục bộ sẽ bị ghi đè: error: Your local changes to the following files would be overwritten by checkout
-
Nếu nhánh đã tồn tại khi dùng -c: fatal: a branch named 'feature/login' already exists
Những thông báo lỗi rõ ràng như vậy giúp giảm các thay đổi trạng thái ngoài ý muốn.
Ví dụ thực tiễn về Git switch
Hiểu git switch sẽ dễ hơn nhiều khi bạn thấy nó trong các quy trình thực tế. Những ví dụ này cho thấy cách nó hoạt động trong quản lý nhánh hằng ngày và vì sao nó an toàn, dễ đoán hơn git checkout.
Các thao tác nhánh tiêu chuẩn
Trong phát triển hằng ngày, bạn chủ yếu di chuyển giữa các nhánh hoặc tạo nhánh mới.
-
Để chuyển sang một nhánh nội bộ đã tồn tại, dùng: git switch <branch_name>. Khi đó, git sẽ di chuyển HEAD đến tên nhánh đã nêu và cập nhật thư mục làm việc cho khớp với nhánh đó.
-
Để tạo nhánh mới cho tính năng “new_ui” và chuyển sang đó trong một bước, dùng git switch -c feature/new-ui. Lệnh này tạo nhánh từ commit hiện tại của bạn và lập tức di chuyển HEAD sang nhánh đó.
-
Nếu cần đặt lại hoặc ghi đè một nhánh đã tồn tại, dùng: git switch -C feature/new-ui. Cờ viết hoa -C buộc tạo hoặc đặt lại con trỏ của nhánh. Điều này làm rõ ý định có tính phá hủy.
-
Bạn cũng có thể chuyển nhanh qua lại giữa hai nhánh gần nhất bằng git switch -. Điều này rất tiện khi bạn xem xét mã trên một nhánh rồi nhiều lần quay lại nhánh tính năng của mình.

Xử lý nhánh từ xa
Thường thì một nhánh tồn tại trên remote nhưng chưa có nội bộ. Ví dụ, ai đó đã đẩy origin/bugfix, nhưng bạn chưa tạo nó.
-
Nếu bạn chạy: git switch bugfix, Git sẽ tạo một nhánh bugfix nội bộ và đặt theo dõi nhánh từ xa origin/bugfix, giả sử có sự khớp rõ ràng ở origin. Điều này đơn giản hóa cộng tác vì bạn không cần tự thiết lập upstream theo dõi.
-
Nếu bạn muốn ngăn Git phỏng đoán, dùng: git switch --no-guess bugfix. Khi đó Git sẽ báo lỗi nếu nhánh chưa tồn tại nội bộ. Điều này hữu ích trong quy trình nghiêm ngặt hơn, nơi việc theo dõi tự động có thể gây nhầm lẫn.
-
Nếu bạn muốn tường minh khi tạo nhánh theo dõi, dùng git switch -c bugfix --track origin/bugfix. Cách này khiến mối quan hệ theo dõi thể hiện rõ ngay trong lệnh.
Xem thử commit theo tính chất thử nghiệm
Đôi khi bạn chỉ muốn xem một commit cũ. Có thể bạn muốn thử một phiên bản trước hoặc xác minh khi nào lỗi được đưa vào. Khi đó, bạn muốn tạm thời di chuyển đến thời điểm đó trong lịch sử.
Với git switch, bạn phải nói rõ: git switch --detach <commit-hash>.
Cờ --detach bảo Git: di chuyển HEAD trực tiếp đến commit này, không đến nhánh. Giờ bạn có thể khám phá mã, chạy test, hoặc build dự án. Nếu bạn tạo commit mới ở trạng thái này, chúng không gắn với nhánh nào trừ khi bạn tạo nhánh.
Với git checkout <commit-hash>, hành động tương tự xảy ra tự động mà không cần cờ bổ sung. Điều này khiến bạn dễ vô tình vào chế độ tách rời, trong khi yêu cầu cờ --detach ở git switch giúp ngăn trạng thái HEAD tách rời ngoài ý muốn.
Tích hợp Git switch vào quy trình làm việc
Tiếp theo, hãy xem bạn có thể tích hợp git switch vào các quy trình Git điển hình như thế nào.
Lựa chọn theo kịch bản
Trong các quy trình phát triển hiện đại, git switch nên xử lý mọi công việc liên quan đến nhánh. Bao gồm
- Phát triển tính năng thường nhật
- Review pull request
- Rebase nội bộ
- Script CI/CD checkout nhánh trong quá trình build
Bởi vì git switch chỉ tập trung vào quản lý nhánh, nó truyền đạt ý định một cách rõ ràng.
git checkout vẫn có vai trò, nhưng hẹp hơn. Nhiều script tự động kế thừa viết trước Git 2.23 vẫn dựa vào nó. Một số tác vụ hoàn nguyên cấp tệp cũng có thể còn dùng, dù git restore là sự thay thế được ưu tiên về sau.
Khắc phục các lỗi thường gặp
Có hai tình huống khác biệt có thể gây rắc rối khi dùng git switch.
“Your local changes would be overwritten”
Một vấn đề phổ biến xuất hiện khi bạn cố chuyển nhánh trong khi có thay đổi nội bộ là “error: Your local changes would be overwritten”. Ở đây, Git chặn thao tác vì việc chuyển sẽ ghi đè công việc chưa commit. Bạn có hai lựa chọn an toàn để vượt qua:
-
Nếu muốn giữ thay đổi để dùng sau, chạy git stash trước khi chuyển sang nhánh đích. Sau khi chuyển, bạn có thể khôi phục bằng git stash pop.
-
Nếu bạn cố ý loại bỏ thay đổi cục bộ, dùng: git switch --discard-changes target-branch. Tùy chọn này bảo Git loại bỏ thay đổi cục bộ và đặt lại index và working tree cho khớp với nhánh đích (nó không xóa tệp chưa theo dõi).
Vô tình rơi vào trạng thái HEAD tách rời
Một tình huống khác là vô tình vào trạng thái HEAD tách rời. Nếu bạn nhận ra mình không ở trên nhánh nào nhưng có công việc muốn giữ lại, hãy tạo ngay một nhánh mới: git switch -c recovery-branch. Điều này gắn lịch sử commit hiện tại của bạn vào một nhánh có tên và bảo toàn thay đổi.
Thực hành tốt khi áp dụng Git switch
Áp dụng git switch không chỉ là sở thích về lệnh. Đó là một nâng cấp cấu trúc nhỏ trong cách các nhóm nghĩ về quy trình Git. Lợi ích sẽ cộng dồn khi việc áp dụng thống nhất trong tài liệu, onboarding và tự động hóa.
Chiến lược chuyển đổi cho đội ngũ
Bắt đầu với tài liệu nội bộ. Nếu các hướng dẫn “Bắt đầu” của bạn vẫn dạy git checkout để chuyển nhánh, hãy cập nhật sang git switch. Chỉ giữ checkout ở nơi thực sự cần thiết.
Đào tạo cũng đóng vai trò quan trọng. Các lệnh Git hiện đại cung cấp thông điệp lỗi rõ ràng hơn, đặc biệt khi thay đổi cục bộ xung đột với việc chuyển nhánh. Khuyến khích nhà phát triển đọc và hiểu các thông báo này thay vì coi chúng là lỗi chung chung. Bộ lệnh mới rõ ràng hơn, và nhận ra điều đó sẽ tăng tự tin và giảm sai sót.
Tính nhất quán trong tự động hóa
Trong shell script, pipeline CI và alias Git, hãy ưu tiên git switch cho việc di chuyển nhánh vì nó truyền đạt ý định ngay lập tức. Một script dùng git switch main dễ hiểu hơn so với script dựa vào git checkout, vốn có thể mang nhiều ý nghĩa.
Nếu bạn định nghĩa alias Git, hãy cập nhật để phản ánh cách dùng hiện đại. Ví dụ, một alias để tạo nhánh tính năng nên bao bọc git switch -c, không phải git checkout -b.
Cuối cùng, hãy kiểm tra phiên bản Git trên mọi môi trường. git switch yêu cầu Git 2.23 trở lên. Đảm bảo máy của lập trình viên, runner CI và máy build đáp ứng yêu cầu này trước khi tiêu chuẩn hóa lệnh mới. Một kiểm tra phiên bản đơn giản sẽ ngăn các vấn đề tương thích tinh vi.
Kết luận
Nhìn rộng ra, lợi thế thực sự của git switch rất đơn giản. Nó làm cho quản lý nhánh rõ ràng, an toàn và có chủ đích hơn. Khi bạn chạy lệnh, không có mơ hồ về việc nó đang làm gì. Bạn đang chuyển nhánh. Chỉ vậy thôi. Và mức độ rõ ràng nhỏ đó loại bỏ đáng kể ma sát trong phát triển hằng ngày.
Tuy nhiên, git checkout chưa bị loại bỏ; bạn vẫn có thể dùng để khôi phục tệp, di chuyển giữa các nhánh hoặc xử lý các tình huống phức tạp hơn. Nhưng cho việc di chuyển nhánh hằng ngày, Git khuyến khích bạn dùng git switch.
Tiếp theo, tôi khuyến nghị bạn học khóa Intermediate Git tập trung vào cộng tác với Git.
Trong một thời gian dài,
git checkoutđảm nhiệm hầu như mọi việc liên quan đến di chuyển trong kho, chuyển nhánh, khôi phục tệp và xem lại các commit cũ. Sự linh hoạt đó lại tạo ra mơ hồ. Cùng một cú pháp có thể mang nghĩa khác nhau tùy theo ngữ cảnh.Chỉ một lỗi gõ nhỏ có thể chuyển nhánh trong khi bạn định khôi phục tệp. Một lần xem lịch sử nhanh bằng
git checkout <commit-hash>có thể khiến bạn rơi vào trạng tháiHEADtách rời mà không nhận ra. Lệnh thì hoạt động, nhưng đòi hỏi bạn luôn phải ý thức về nhiều hành vi khác nhau của nó.Đó là lý do Git 2.23 giới thiệu
git switch, một lệnh chuyên biệt hơn để xử lý các thao tác với nhánh.Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách
git switchkhác vớigit checkout. Chúng ta cũng sẽ phân tích vị trí của từng lệnh trong quy trình làm việc hiện đại và xem phạm vi của chúng.Nếu bạn còn khá mới với Git, tôi khuyến nghị học các kiến thức cơ bản trong khóa Introduction to Git của chúng tôi.
Git switch là gì?
git switchlà lệnh chuyên dụng được giới thiệu trong Git 2.23 để quản lý việc di chuyển giữa các nhánh và tạo nhánh. Nó giúp việc chuyển nhánh gọn gàng, an toàn và ít lỗi hơn.Trước khi có nó, các nhà phát triển dùng
git checkoutđể chuyển nhánh. Vấn đề làgit checkoutxử lý nhiều tác vụ không liên quan:Điều này khiến lệnh bị “quá tải” và dễ bị dùng sai.
Git giải quyết bằng cách tách trách nhiệm.
git switchgiờ đảm nhiệm chuyển và tạo nhánh, còngit restoređảm nhiệm khôi phục tệp. Sự phân tách này giảm mơ hồ và hạ rủi ro thay đổi tệp ngoài ý muốn.Trong thực tế,
git switch branch-namedi chuyển con trỏ HEAD hiện tại của bạn đến tên nhánh được chỉ định. Bạn cũng có thể dùnggit switch -c new-branchđể tạo và chuyển sang nhánh mới.Cơ chế cốt lõi: Git switch vs checkout
Giờ khi bạn hiểu vì sao
git switchra đời, hãy xem nó thực sự khácgit checkoutnhư thế nào ở bên trong.Quản lý nhánh theo mục đích
Trước Git 2.23,
git checkoutxử lý cả di chuyển nhánh và khôi phục tệp. Thiết kế đó hoạt động, nhưng trộn lẫn hai khái niệm hoàn toàn khác. Nó di chuyển HEAD, khôi phục tệp và checkout các commit. Tùy cách bạn dùng, nó thao tác với con trỏ HEAD, chỉ mục (index) và thư mục làm việc (working tree).git switchtập trung hoàn toàn vào việc di chuyển con trỏ HEAD giữa các nhánh. Khi bạn chạygit switch branch-name, Git cập nhật HEAD trỏ tới nhánh đó và điều chỉnh thư mục làm việc cho phù hợp. Vậy nên lệnh này tồn tại chuyên cho việc di chuyển và tạo nhánh. Vớigit switchvàgit restore, trách nhiệm được phân chia rõ:git switchdi chuyểnHEADgiữa các nhánh.git restoresửa đổi các tệp trong working tree hoặc index.Ví dụ, trước đây để khôi phục tệp, cần:
git checkout HEAD -- file.txt. Ngày nay, cách khuyến nghị là:git restore file.txt.Ở đây, bạn đang khôi phục tệp, không phải di chuyển nhánh. Trong script và tài liệu nhóm, sự phân biệt này cải thiện khả năng đọc và giảm sai sót.
Sự tiến hóa của các lệnh Git
Git 2.23 tách trách nhiệm bằng cách giới thiệu
git switchcho các thao tác với nhánh vàgit restorecho khôi phục tệp.Trước phiên bản đó,
git checkouthoạt động như công cụ đa năng. Nó có thể đổi nhánh, khôi phục tệp, hoặc chuyển đến commit bất kỳ. Tuy nhiên, điều này gây nhầm lẫn, đặc biệt với người mới. Do đó, bằng cách tách lệnh, Git giảm mơ hồ và làm rõ các quy trình thường gặp.Hành vi HEAD tách rời
Trong Git,
HEADthường trỏ đến một nhánh. Nhánh đó lại trỏ đến commit mới nhất. Khi bạn tạo commit mới, Git đẩy nhánh tiến về phía trước. Đây là quy trình chuẩn.HEAD tách rời xảy ra khi HEAD trỏ trực tiếp đến một commit thay vì nhánh. Ở trạng thái đó, bạn không còn ở trên nhánh nào. Nếu bạn tạo commit mới, Git vẫn tạo, nhưng không có tên nhánh nào tham chiếu đến nó. Trừ khi bạn tạo nhánh rõ ràng, các commit đó không được tham chiếu và có thể khó tìm về sau.
Khi bạn chạy
git checkout <commit-hash>, Git sẽ tự động vào chế độ HEAD tách rời. Git chuyển sang commit đó và tách HEAD mà không yêu cầu xác nhận thêm. Hành vi này là hợp lệ, nhưng dễ dẫn đến chế độ tách rời một cách tự động.Ngược lại,
git switchyêu cầu nêu rõ ràng. Để tách HEAD, bạn phải dùnggit switch --detach <commit-hash>. Không có cờ--detach,git switchchỉ hoạt động trên các nhánh. Thiết kế này giảm các trạng thái tách rời ngoài ý muốn và làm quy trình với nhánh an toàn, dễ dự đoán hơn.Những khác biệt chức năng chính giữa Git switch và checkout
Giờ khi đã bao quát các khác biệt cấp cao giữa hai lệnh, hãy xem xét cú pháp, phạm vi và yếu tố an toàn.
Cú pháp lệnh và tạo nhánh
Để tạo và chuyển sang nhánh mới với
git switch, bạn chạygit switch -c <branch-name>. Vớigit checkout, lệnh tương đương làgit checkout -b <branch-name>.Cả hai đều tạo nhánh mới và chuyển sang nhánh đó, nhưng khác biệt nằm ở mức độ rõ ràng về ý định. Trong
git switch, cờ-cbáo hiệu trực tiếp rằng bạn đang tạo nhánh, trong khi ởgit checkout,-btheo lịch sử nghĩa là “branch” nhưng ít rõ ràng hơn về ý định.git switchcũng giới thiệu cờ-C:git switch -C <branch-name>. Tác dụng của nó mạnh hơn-c: ép tạo nhánh, hoặc đặt lại nếu đã tồn tại. Hành vi này rõ ràng và tập trung vào nhánh. Tronggit checkout, hành vi ép tương tự có tồn tại, nhưng ngữ nghĩa ít tách bạch hơn vì lệnh phục vụ nhiều mục đích.Phạm vi thao tác
git switchchỉ làm việc với nhánh. Nó không thể khôi phục tệp, bỏ stage thay đổi, hoặc checkout các đường dẫn cụ thể từ commit trước. Về cơ bản, nó không hỗ trợ thao tác cấp tệp.Ngược lại,
git checkoutcó thể hoạt động ở cấp tệp. Ví dụ,git checkout <commit> -- <file>khôi phục một tệp cụ thể từ một commit trước đó.Tuy nhiên, tài liệu Git hiện đại gợi ý dùng
git restorecho mục đích này. Điểm mấu chốt làgit switchcố ý loại trừ việc thao tác tệp để giữ phạm vi hẹp và dễ đoán.Tính an toàn và gỡ mơ hồ
Một vấn đề phổ biến với
git checkoutlà mơ hồ. Nếu tên nhánh và tên tệp trùng nhau, tùy ngữ cảnh, nó có thể chuyển nhánh hoặc khôi phục tệp.git switchtránh hoàn toàn sự mơ hồ này. Nó chỉ hoạt động trên nhánh. Nếu bạn không cung cấp tên nhánh hợp lệ, Git sẽ báo lỗi rõ ràng thay vì đoán.git switchcũng cung cấp xử lý lỗi rõ ràng hơn khi thay đổi cục bộ xung đột với nhánh đích. Nếu chuyển nhánh sẽ ghi đè công việc chưa commit, Git dừng thao tác và hiển thị thông báo lỗi trực tiếp, như sau:Nếu nhánh không tồn tại:
fatal: invalid reference: feature/loginNếu thay đổi cục bộ sẽ bị ghi đè:
error: Your local changes to the following files would be overwritten by checkoutNếu nhánh đã tồn tại khi dùng
-c:fatal: a branch named 'feature/login' already existsNhững thông báo lỗi rõ ràng như vậy giúp giảm các thay đổi trạng thái ngoài ý muốn.
Ví dụ thực tiễn về Git switch
Hiểu
git switchsẽ dễ hơn nhiều khi bạn thấy nó trong các quy trình thực tế. Những ví dụ này cho thấy cách nó hoạt động trong quản lý nhánh hằng ngày và vì sao nó an toàn, dễ đoán hơngit checkout.Các thao tác nhánh tiêu chuẩn
Trong phát triển hằng ngày, bạn chủ yếu di chuyển giữa các nhánh hoặc tạo nhánh mới.
Để chuyển sang một nhánh nội bộ đã tồn tại, dùng:
git switch <branch_name>. Khi đó, git sẽ di chuyểnHEADđến tên nhánh đã nêu và cập nhật thư mục làm việc cho khớp với nhánh đó.Để tạo nhánh mới cho tính năng “new_ui” và chuyển sang đó trong một bước, dùng
git switch -c feature/new-ui. Lệnh này tạo nhánh từ commit hiện tại của bạn và lập tức di chuyểnHEADsang nhánh đó.Nếu cần đặt lại hoặc ghi đè một nhánh đã tồn tại, dùng:
git switch -C feature/new-ui. Cờ viết hoa-Cbuộc tạo hoặc đặt lại con trỏ của nhánh. Điều này làm rõ ý định có tính phá hủy.Bạn cũng có thể chuyển nhanh qua lại giữa hai nhánh gần nhất bằng
git switch -. Điều này rất tiện khi bạn xem xét mã trên một nhánh rồi nhiều lần quay lại nhánh tính năng của mình.Xử lý nhánh từ xa
Thường thì một nhánh tồn tại trên remote nhưng chưa có nội bộ. Ví dụ, ai đó đã đẩy
origin/bugfix, nhưng bạn chưa tạo nó.Nếu bạn chạy:
git switch bugfix, Git sẽ tạo một nhánh bugfix nội bộ và đặt theo dõi nhánh từ xaorigin/bugfix, giả sử có sự khớp rõ ràng ở origin. Điều này đơn giản hóa cộng tác vì bạn không cần tự thiết lập upstream theo dõi.Nếu bạn muốn ngăn Git phỏng đoán, dùng:
git switch --no-guess bugfix. Khi đó Git sẽ báo lỗi nếu nhánh chưa tồn tại nội bộ. Điều này hữu ích trong quy trình nghiêm ngặt hơn, nơi việc theo dõi tự động có thể gây nhầm lẫn.Nếu bạn muốn tường minh khi tạo nhánh theo dõi, dùng
git switch -c bugfix --track origin/bugfix. Cách này khiến mối quan hệ theo dõi thể hiện rõ ngay trong lệnh.Xem thử commit theo tính chất thử nghiệm
Đôi khi bạn chỉ muốn xem một commit cũ. Có thể bạn muốn thử một phiên bản trước hoặc xác minh khi nào lỗi được đưa vào. Khi đó, bạn muốn tạm thời di chuyển đến thời điểm đó trong lịch sử.
Với
git switch, bạn phải nói rõ:git switch --detach <commit-hash>.Cờ
--detachbảo Git: di chuyểnHEADtrực tiếp đến commit này, không đến nhánh. Giờ bạn có thể khám phá mã, chạy test, hoặc build dự án. Nếu bạn tạo commit mới ở trạng thái này, chúng không gắn với nhánh nào trừ khi bạn tạo nhánh.Với
git checkout <commit-hash>, hành động tương tự xảy ra tự động mà không cần cờ bổ sung. Điều này khiến bạn dễ vô tình vào chế độ tách rời, trong khi yêu cầu cờ--detachởgit switchgiúp ngăn trạng thái HEAD tách rời ngoài ý muốn.Tích hợp Git switch vào quy trình làm việc
Tiếp theo, hãy xem bạn có thể tích hợp
git switchvào các quy trình Git điển hình như thế nào.Lựa chọn theo kịch bản
Trong các quy trình phát triển hiện đại,
git switchnên xử lý mọi công việc liên quan đến nhánh. Bao gồmBởi vì
git switchchỉ tập trung vào quản lý nhánh, nó truyền đạt ý định một cách rõ ràng.git checkoutvẫn có vai trò, nhưng hẹp hơn. Nhiều script tự động kế thừa viết trước Git 2.23 vẫn dựa vào nó. Một số tác vụ hoàn nguyên cấp tệp cũng có thể còn dùng, dù git restore là sự thay thế được ưu tiên về sau.Khắc phục các lỗi thường gặp
Có hai tình huống khác biệt có thể gây rắc rối khi dùng
git switch.“Your local changes would be overwritten”
Một vấn đề phổ biến xuất hiện khi bạn cố chuyển nhánh trong khi có thay đổi nội bộ là “error: Your local changes would be overwritten”. Ở đây, Git chặn thao tác vì việc chuyển sẽ ghi đè công việc chưa commit. Bạn có hai lựa chọn an toàn để vượt qua:
Nếu muốn giữ thay đổi để dùng sau, chạy
git stashtrước khi chuyển sang nhánh đích. Sau khi chuyển, bạn có thể khôi phục bằnggit stash pop.Nếu bạn cố ý loại bỏ thay đổi cục bộ, dùng:
git switch --discard-changes target-branch. Tùy chọn này bảo Git loại bỏ thay đổi cục bộ và đặt lại index và working tree cho khớp với nhánh đích (nó không xóa tệp chưa theo dõi).Vô tình rơi vào trạng thái HEAD tách rời
Một tình huống khác là vô tình vào trạng thái
HEADtách rời. Nếu bạn nhận ra mình không ở trên nhánh nào nhưng có công việc muốn giữ lại, hãy tạo ngay một nhánh mới:git switch -c recovery-branch. Điều này gắn lịch sử commit hiện tại của bạn vào một nhánh có tên và bảo toàn thay đổi.Thực hành tốt khi áp dụng Git switch
Áp dụng
git switchkhông chỉ là sở thích về lệnh. Đó là một nâng cấp cấu trúc nhỏ trong cách các nhóm nghĩ về quy trình Git. Lợi ích sẽ cộng dồn khi việc áp dụng thống nhất trong tài liệu, onboarding và tự động hóa.Chiến lược chuyển đổi cho đội ngũ
Bắt đầu với tài liệu nội bộ. Nếu các hướng dẫn “Bắt đầu” của bạn vẫn dạy
git checkoutđể chuyển nhánh, hãy cập nhật sanggit switch. Chỉ giữcheckoutở nơi thực sự cần thiết.Đào tạo cũng đóng vai trò quan trọng. Các lệnh Git hiện đại cung cấp thông điệp lỗi rõ ràng hơn, đặc biệt khi thay đổi cục bộ xung đột với việc chuyển nhánh. Khuyến khích nhà phát triển đọc và hiểu các thông báo này thay vì coi chúng là lỗi chung chung. Bộ lệnh mới rõ ràng hơn, và nhận ra điều đó sẽ tăng tự tin và giảm sai sót.
Tính nhất quán trong tự động hóa
Trong shell script, pipeline CI và alias Git, hãy ưu tiên
git switchcho việc di chuyển nhánh vì nó truyền đạt ý định ngay lập tức. Một script dùnggit switch maindễ hiểu hơn so với script dựa vàogit checkout, vốn có thể mang nhiều ý nghĩa.Nếu bạn định nghĩa alias Git, hãy cập nhật để phản ánh cách dùng hiện đại. Ví dụ, một alias để tạo nhánh tính năng nên bao bọc
git switch -c, không phảigit checkout -b.Cuối cùng, hãy kiểm tra phiên bản Git trên mọi môi trường.
git switchyêu cầu Git 2.23 trở lên. Đảm bảo máy của lập trình viên, runner CI và máy build đáp ứng yêu cầu này trước khi tiêu chuẩn hóa lệnh mới. Một kiểm tra phiên bản đơn giản sẽ ngăn các vấn đề tương thích tinh vi.Kết luận
Nhìn rộng ra, lợi thế thực sự của
git switchrất đơn giản. Nó làm cho quản lý nhánh rõ ràng, an toàn và có chủ đích hơn. Khi bạn chạy lệnh, không có mơ hồ về việc nó đang làm gì. Bạn đang chuyển nhánh. Chỉ vậy thôi. Và mức độ rõ ràng nhỏ đó loại bỏ đáng kể ma sát trong phát triển hằng ngày.Tuy nhiên,
git checkoutchưa bị loại bỏ; bạn vẫn có thể dùng để khôi phục tệp, di chuyển giữa các nhánh hoặc xử lý các tình huống phức tạp hơn. Nhưng cho việc di chuyển nhánh hằng ngày, Git khuyến khích bạn dùnggit switch.Tiếp theo, tôi khuyến nghị bạn học khóa Intermediate Git tập trung vào cộng tác với Git.