Sự khác biệt giữa git switch và git checkout <branch>


152

Git 2.23 giới thiệu một lệnh mới git switch- sau khi đọc tài liệu, nó có vẻ giống như git checkout <branchname>ai đó có thể giải thích sự khác biệt hoặc trường hợp sử dụng không?

Hai lệnh mới "git switch" và "git restore" được giới thiệu để tách "kiểm tra một nhánh để cải tiến lịch sử của nó" và "kiểm tra các đường dẫn ra khỏi chỉ mục và / hoặc một cây để làm việc để cải thiện hiện tại history "ra khỏi lệnh" git checkout ".


2
Có một bài viết tốt tại InfoQ về chủ đề này: infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

Câu trả lời:


168

Vâng, theo tài liệu bạn liên kết đến, mục đích duy nhất của nó là phân tách và làm rõ hai cách sử dụng khác nhau của git checkout:

  • git switchbây giờ có thể được sử dụng để thay đổi ngành, như git checkout <branchname>không
  • git restorecó thể được sử dụng để thiết lập lại các tập tin để sửa đổi nhất định, như git checkout --<path_to_file>không

Mọi người bối rối bởi những cách sử dụng khác nhau này git checkout, như bạn có thể thấy từ nhiều câu hỏi liên quan đến git checkoutđây trên Stackoverflow. Các nhà phát triển Git dường như đã tính đến điều này.


30
Đây có vẻ là một thay đổi tốt. Tạo một chi nhánh? git checkoutChuyển chi nhánh? git checkoutNhận một phiên bản nhất định của một tệp? git checkoutXóa các thay đổi đối với một tệp? git checkoutThành thật mà nói, tôi tự hỏi có bao nhiêu quy trình làm việc git bình thường có thể được thực hiện với các cờ khác nhau git checkout.
Captain Man

4
Vì vậy, ý tưởng bây giờ git checkoutkhông còn cần thiết về mặt kỹ thuật cho bất cứ thứ gì nữa? Hay nó vẫn được sử dụng cho một số việc nhất định, chẳng hạn như kiểm tra một cam kết không phải là đầu nhánh (chuyển sang chế độ "đầu tách rời")?
PieterNuyts

4
@Mike Làm thế nào bạn có thể nói thanh toán không tạo ra chi nhánh một câu sau khi bạn nói thanh toán tạo ra chi nhánh? Không quan trọng hoạt động bên trong của -blá cờ. Nó vẫn tạo ra một nhánh.
Captain Man

4
@CaptainMan, checkout hoạt động không tạo ra một nhánh, nó chỉ có thể chuyển thành một nhánh đã tồn tại. Các -btùy chọn để các checkout lệnh nội bộ thực hiện một git branchtrước khi nó thực sự làm các kiểm tra. Điều này cũng giống như git pullmột phím tắt cho git fetch+ git merge.
Mike

4
Lưu ý hữu ích: đối với những người đã quen, git checkout -b <branch name>bạn có thể sử dụng git switch -c <branch name>để có được hiệu quả tương tự
Xeuron

66

git checkout là một con dao quân đội Thụy Sĩ có một số cách sử dụng không liên quan.

Nếu bạn sửa đổi tệp nhưng chưa thực hiện thay đổi, thì git checkout <filename>sẽ đảo ngược các sửa đổi ... một cách nhanh chóng và dễ dàng để hủy thay đổi đối với tệp. Bạn vẫn ở trong cùng một chi nhánh.

git checkout <branchname> (như bạn đã lưu ý) chuyển các nhánh.

Hai mục đích hoàn toàn khác nhau, có thể dẫn đến nhầm lẫn nếu tên tệp và tên chi nhánh giống nhau.

Có hai lệnh thì rõ ràng hơn.


Như bạn đã đề cập có một nhánh và tệp trùng tên là điều khó hiểu. Tôi giả sử nhánh ưu tiên hơn tệp, vì điều đó thường được mong muốn hơn? Hoặc nó hoạt động như thế nào?
AgentM

@AgentM Đúng, chính xác. Nếu một nhánh và một tệp có cùng tên thì thực hiện git checkout <name>ưu tiên nhánh thay vì tệp.
Kartik Soneji

2

switchcó một số hạn chế: tại thời điểm này, bạn có thể chuyển từ bất kỳ cam kết nào sang <branch name>, tuy nhiên không thể chuyển từ <branch name> một cam kết cụ thể với trạng thái HEAD tách rời . Vì vậy, bạn cần sử dụng git checkout 5efb(trong đó 5efb là một ví dụ về tham chiếu băm cho cam kết tùy ý)


3
Tôi cho rằng đây là một tính năng cơ bản chứ không phải một lỗi (giới hạn). switchđược tạo ra cho một mục đích duy nhất là thay đổi chi nhánh và khi bạn làm điều đó, bạn thực sự muốn đứng ở HEAD của chi nhánh đó. checkoutlà một hoạt động tổng quát hơn, đưa bản sao làm việc của bạn phù hợp với bất kỳ trạng thái nhất định nào trong lịch sử (= commit). Vì bất kỳ tên chi nhánh nào cũng là bí danh cho cam kết HEAD của chi nhánh đó, nên việc kiểm tra một chi nhánh về mặt kỹ thuật không khác gì so với bất kỳ cam kết nào khác.
Mike

14
với -dbạn có thể:git switch -d 6c13
Mendi Barel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.