Kiểm tra git thực sự có nghĩa là gì?


93

Là gì checkouts trong git?

Tôi biết khi bạn làm checkoutvới một nhánh cụ thể, các HEADđiểm đến nhánh đó. Nhưng những gì nó thực sự có nghĩa gì? Có nghĩa là sau đó tôi có thể làm việc trên chi nhánh đó? Nếu có, sau đó, nếu không kiểm tra một chi nhánh, tôi không thể làm việc trên nó?

Ngoài ra, remote checkoutcó nghĩa là gì? Nó hữu ích như thế nào?


1
Không có. Vâng, tôi có và tôi bắt gặp lý thuyết về ý nghĩa của nó. tức là trỏ đến HEAD vv Nhưng tôi muốn biết từ quan điểm "mã thanh toán - thực hiện thay đổi - đăng ký" hay nó khác?
daehaai

24
@antonijn - Tôi đã thử tìm kiếm câu hỏi - đây là kết quả đầu tiên - hơi buồn là khi tôi đến đây, tôi thấy câu hỏi đã bị đóng lại và thái độ điên rồ này mà mọi người đều có - tôi đến từ TFS, và tôi Tôi bắt đầu nghi ngờ "Checkout" có nghĩa là một cái gì đó hoàn toàn khác trong GIT. Tôi muốn biết ý nghĩa của nó trong git-land.
BrainSlugs83

Câu trả lời:


57

Như bạn đã lưu ý, HEADmột nhãn ghi chú bạn đang ở đâu trong cây cam kết. Nó di chuyển cùng bạn khi bạn chuyển từ cam kết này sang cam kết khác. git checkout <commit>là cơ chế cơ bản để di chuyển trong cây cam kết, di chuyển tiêu điểm của bạn ( HEAD) đến cam kết được chỉ định.

Các cam kết có thể được xác định bởi bất kỳ một số cách khác nhau, cam kết băm, tên chi nhánh, tên thẻ, cú pháp tương đối ( HEAD^, HEAD~1, vv) và vân vân. Thường sẽ hữu ích khi coi một thanh toán đang thay đổi các nhánh và có một số tùy chọn hoạt động theo quan điểm đó, nhưng tất cả chúng đều tham chiếu đến cam kết.

Để kiểm tra một cam kết có một số mặt ảnh hưởng ngoài việc di chuyển HEADxung quanh.

  • Thư mục làm việc được cập nhật thành trạng thái của cam kết đã kiểm tra.
  • nếu tên chi nhánh được chỉ định, kiểm tra làm cho chi nhánh đó hoạt động. Nhánh hoạt động sẽ di chuyển cùng với bất kỳ cam kết mới nào được thêm vào.
    • với -btùy chọn, một nhánh mới sẽ được tạo dựa trên cam kết hiện tại và sau đó được kích hoạt.
    • với --tracktùy chọn, chi nhánh đã kiểm tra có thể nhận biết được chi nhánh từ xa
    • với --orphantùy chọn, một nhánh mới được tạo (như với -b) nhưng sẽ không dựa trên bất kỳ cam kết hiện có nào.

Có một số tùy chọn khác, bạn có thể đọc trong trang man-git checkout , tất cả đều xoay quanh việc chuyển từ cam kết này sang cam kết khác - chỉ khác nhau về tác dụng của động tác đó ngoài việc di chuyển HEAD.


Vì vậy, có vẻ như "thanh toán" có nghĩa là một cái gì đó hoàn toàn khác (dù sao so với TFS - TFS tương đương sẽ là "nhận" một "bộ thay đổi" cụ thể). Rất vui vì tôi đã nhìn lên điều này! - có hằng số ma thuật nào cho "mới nhất" không? (trong TFS là "T") - bằng cách đó chúng ta có thể tải xuống phiên bản mã mới nhất mà không cần biết nhãn "HEAD"?
BrainSlugs83

1
Nếu bạn đang ở trên một chi nhánh, tên chi nhánh là cam kết mới nhất cho chi nhánh đó - nếu bạn không ở trên một chi nhánh, bạn đang sử dụng cam kết mới nhất. Tôi sẽ sử dụng lệnh nhật ký để tìm cam kết gần đây nhất trong kho lưu trữ mà không liên quan đến nhánh và sau đó di chuyển đến nó theo cách thủ công - nhưng tôi chắc chắn rằng nó có thể được tự động hóa nếu cần.
David Culp

Về đoạn cuối: xin lưu ý rằng git checkout <commit> <path>không chuyển nhánh.
galath

Lời giải thích của bạn là không sai nhưng bạn quên một trường hợp sử dụng rất quan trọng (và nguy hiểm tiềm tàng): git checkout <path>.
Eric Duminil 20/07/19

24

Hãy để tôi giải thích một số trường hợp sử dụng của thanh toán với tệp, thư mục và các nhánh để nó có thể hữu ích trong việc hiểu.

Giả sử chúng ta có thư mục được đặt tên devindex.htmlmọi thứ đều được theo dõi và thư mục làm việc sạch sẽ.

Nếu tôi vô tình thay đổi tên tệp index.htmlvà tôi muốn hoàn tác mà tôi sẽ sử dụng, git checkout index.htmlnó sẽ khôi phục trạng thái tệp đó từ kho lưu trữ hiện được chọn nhánh.

Bây giờ nếu tôi đã thực hiện một số thay đổi trong devthư mục và muốn khôi phục điều đó. Tôi có thể sử dụng git checkout devnhưng điều gì sẽ xảy ra nếu đã có nhánh được đặt tên devthay vì kiểm tra thư mục đó, nó sẽ kéo xuống nhánh đó. Để tránh điều đó, tôi muốn làm git checkout -- dev.

Bây giờ ở đây dấu gạch ngang đôi trần là viết tắt của nhánh hiện tại và yêu cầu git cho thư mục devtừ nhánh hiện được chọn.

Tương tự Nếu tôi làm điều git checkout alpha devđó sẽ kéo xuống thư mục dev từ nhánh alpha.

Câu trả lời này dành cho câu hỏi đầu tiên của bạn 'git checkout thực sự có ý nghĩa gì'.


2
Ở dòng cuối cùng của bạn Câu trả lời này dành cho câu hỏi đầu tiên của bạn 'git checkout thực sự có ý nghĩa gì'. bạn đang kiểm tra thư mục 'thực sự' từ chi nhánh 'mean': P
Paramvir Singh Karwal,

22

"Để kiểm tra" có nghĩa là bạn lấy bất kỳ cam kết nhất định nào từ kho lưu trữ và tạo lại trạng thái của tệp liên kết và cây thư mục trong thư mục đang làm việc.

Khi bạn kiểm tra một cam kết không phải là đầu nhánh (ví dụ git checkout HEAD~2), bạn đang ở trên cái gọi là đầu tách rời . Bạn có thể tạo các cam kết tại đây, nhưng khi bạn chuyển sang một nhánh khác, các cam kết đó sẽ không thể khôi phục được bằng tên nhánh và thậm chí có thể bị bộ thu gom rác xóa sau một thời gian.

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.