Sự khác biệt giữa CHÍNH và chủ


186

Sự khác biệt giữa HEADmastertrong Git là gì?

Tôi đã thực hiện một bản sao của một dự án trên GitHub và muốn đẩy các thay đổi của mình lên điều khiển từ xa. Nhưng tôi nên đẩy cái nào?

ảnh chụp màn hình

Câu trả lời:


162

masterlà một tham chiếu đến cuối của một chi nhánh. Theo quy ước (và theo mặc định), đây thường là nhánh tích hợp chính, nhưng nó không phải như vậy.

HEADthực sự là một loại tham chiếu đặc biệt chỉ đến một tham chiếu khác. Nó có thể trỏ đến master hoặc có thể không (nó sẽ trỏ đến bất kỳ chi nhánh nào hiện đang được kiểm tra). Nếu bạn biết bạn muốn cam kết với masterchi nhánh thì hãy đẩy sang đây.

Đây là một ví dụ trực quan:

văn bản thay thế

Trên kho lưu trữ của riêng bạn, bạn có thể kiểm tra vị trí HEADtrỏ tới bằng cách chạy này:

$ git symbolic-ref HEAD
refs/heads/master

Tuy nhiên, việc tìm ra nơi remotes/origin/HEADchỉ vào là khó khăn hơn vì nó nằm trên máy từ xa.

Có một hướng dẫn nhỏ tuyệt vời về tài liệu tham khảo git ở đây:

http://people.gnome.org/~federico/news-2008-11.html#pushing-and-pulling-with-git-1


1
+1 Câu trả lời chính xác hơn của tôi. Xem thêm stackoverflow.com/questions/3301956/ và và stackoverflow.com/questions/3301956/ cho các minh họa xung quanh các khái niệm đó.
VonC

37

Câu trả lời đơn giản HEADlà một con trỏ / nhãn cho cam kết gần đây nhất của nhánh bạn hiện đang ở. masterlà nhánh mặc định được tạo khi bạn khởi tạo kho git (ví dụ git init).

Bạn có thể xóa masterchi nhánh (ví dụ git branch -D master). Bạn không thể xóa HEADcon trỏ.


6
" HEADlà một con trỏ / nhãn cho cam kết gần đây nhất của chi nhánh bạn hiện đang ở." Tôi nghĩ rằng điều này là sai lệch ở tốt nhất. Nếu bạn kiểm tra một cam kết cũ hơn, thì bây giờ CHÍNH là một con trỏ tới cam kết cũ hơn đó, không phải là cam kết gần đây nhất. Đúng?
LarsH 17/03/2016

2
Bạn nói đúng. ĐẦU là kiểm tra mới nhất của bạn. Nhưng để bảo vệ tôi, đối với Git, checkoutlệnh này tương đương với việc chuyển nhánh trong các hệ thống SCM phổ biến khác.
benhorgen

1
Tôi thông cảm ... Tôi có thể dễ dàng mắc phải sai lầm tương tự. Lý do duy nhất tôi nhận thấy là vì tôi đang ở giai đoạn cố gắng nghiên cứu ý nghĩa thực sự của HEAD. Bất kỳ cơ hội bạn có thể chỉnh sửa câu trả lời của bạn là chính xác? Tôi thấy ĐẦU là một khái niệm khó để tìm mô tả chính xác, cho những người không phải là chuyên gia như tôi. Và có lời khuyên ngồi ngoài đó trên web cung cấp thông tin không chính xác về HEAD làm cho nó khó hơn một chút.
LarsH

2
Tôi nghĩ rằng nhận xét của bạn là một sự làm rõ tuyệt vời cho bất cứ ai tìm kiếm sự hiểu biết tốt hơn về HEADcon trỏ Git thực sự là gì. Tôi đánh giá cao bình luận của bạn và nghĩ rằng những người khác cũng sẽ như vậy. Nội dung bài viết gốc của tôi cùng với bình luận theo dõi của bạn bổ sung cho nhau. Cảm ơn.
benhorgen

4
Một kỹ thuật, nhưng nếu bạn kiểm tra một cam kết cũ hơn, bạn không còn 'trên' một chi nhánh. Nếu bạn kiểm tra một cam kết thay vì một chi nhánh, bạn có cái được gọi là "ĐẦU tách rời", bạn không còn "trên một chi nhánh". Trở thành "trên một nhánh" có nghĩa là TRỤ của bạn đang tham chiếu một chi nhánh và theo định nghĩa, bạn đang ở trong cam kết gần đây nhất của chi nhánh đó. Chỉ vì bạn đã kiểm tra 'b54fe7' và điểm chính cho cam kết đó, không có nghĩa là bạn đang ở trong nhánh chính. Có thể có một vài nhánh trỏ đến cùng một cam kết, bạn đang 'trên' nhánh mà CHÍNH đang chỉ đến, nếu có.
Jason Goemaat

8

Đơn giản chỉ cần đẩy những thay đổi của chi nhánh hiện tại của bạn

git push origin

và nó sẽ đẩy chi nhánh của bạn ' B' thay đổi thành ' origin/B'.
Nếu bạn ở trên masterchi nhánh của bạn , git sẽ đẩy đến origin/master.
Trên thực tế, nó sẽ đẩy tất cả các thay đổi trên các nhánh cục bộ phù hợp với các nhánh từ xa tại origin. Nó được điều khiển bởi cài đặt cấu hình push.default .
Xem thêm đẩy RefSpecs trong sách Pro Git .


Những gì bạn đang thấy là thanh bên đại diện cho tất cả các refspecs của repo từ xa của bạn trong ngã ba GitX thử nghiệm của dự án GitX .

văn bản thay thế

Các HEADsẽ chỉ chi nhánh mặc định cho từ xa mà.
Xem git remote set-headtrang người đàn ông :

Không có một nhánh mặc định cho một điều khiển từ xa là không bắt buộc, nhưng cho phép tên của điều khiển từ xa được chỉ định thay cho một chi nhánh cụ thể.
Ví dụ: nếu nhánh mặc định cho originđược đặt thành master, thì origincó thể được chỉ định ở bất cứ nơi nào bạn thường chỉ định origin/master.

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.