Đầu trong Git là gì?


Câu trả lời:


775

Bạn có thể nghĩ về ĐẦU là "nhánh hiện tại". Khi bạn chuyển đổi các nhánh với git checkout, phiên bản CHÍNH thay đổi để trỏ đến đỉnh của nhánh mới.

Bạn có thể thấy những gì CHÍNH chỉ ra bằng cách làm:

cat .git/HEAD

Trong trường hợp của tôi, đầu ra là:

$ cat .git/HEAD
ref: refs/heads/master

TRƯỚC có thể đề cập đến một sửa đổi cụ thể không liên quan đến tên chi nhánh. Tình huống này được gọi là một ĐẦU tách ra .


53
Vì vậy, git HEAD là bối cảnh phụ thuộc vào bạn đang ở CHI NHÁNH nào, đúng không? Xa hơn nữa, bạn là một nhà phát triển? Tôi đoán tôi đang hỏi, Git HEAD sẽ là một thứ toàn cầu lưu trữ, hay cá nhân cho mỗi nhà phát triển?
bobobobo

91
@bobobobo: Đúng vậy, HEAD giống như một con trỏ trỏ đến nhánh hiện tại. Khi bạn kiểm tra một chi nhánh khác, CHÍNH thay đổi để trỏ đến chi nhánh mới. Đầu hiện tại là cục bộ của từng kho lưu trữ và do đó là riêng cho từng nhà phát triển.
Greg Hewgill

16
@Meng Điều này đã giúp tôi, hy vọng nó sẽ giúp: marklodato.github.com/visual-git-guide/index-en.html
raphael

54
@ 動靜: CHÍNH có thể trỏ đến bất kỳ cam kết nào , nó không cần phải là cam kết cuối cùng trong bất kỳ chi nhánh nào. (Khi CHÍNH chỉ vào một cam kết không phải là cam kết cuối cùng trong một nhánh, đó là "ĐẦU tách rời").
Greg Hewgill

127
ĐẦU không phải là "chi nhánh hiện tại". Là tên được đặt cho cam kết từ đó trạng thái hiện tại của cây làm việc được khởi tạo. Trong điều kiện thực tế hơn, nó có thể được coi là một tài liệu tham khảo mang tính biểu tượng cho cam kết thanh toán.
Ben Collins

184

Để trích dẫn người khác :

Một cái đầu chỉ đơn giản là một tham chiếu đến một đối tượng cam kết. Mỗi đầu có một tên (tên chi nhánh hoặc tên thẻ, v.v.). Theo mặc định, có một cái đầu trong mỗi kho lưu trữ được gọi là master. Một kho lưu trữ có thể chứa bất kỳ số lượng người đứng đầu. Tại bất kỳ thời điểm nào, một đầu được chọn là đầu hiện tại. Cái đầu này được đặt bí danh là CHÍNH, luôn ở thủ đô ".

Lưu ý sự khác biệt này: một đầu người đầu mối (chữ thường) đề cập đến bất kỳ một trong những đầu được đặt tên trong kho lưu trữ; ĐẦU TIÊN (chữ hoa) chỉ dành riêng cho người đứng đầu hiện đang hoạt động. Sự khác biệt này được sử dụng thường xuyên trong tài liệu Git.

Một nguồn tốt khác nhanh chóng bao gồm các hoạt động bên trong của git (và để hiểu rõ hơn về người đứng đầu / ĐẦU) có thể được tìm thấy ở đây . Tài liệu tham khảo (ref :) hoặc người đứng đầu hoặc chi nhánh có thể được coi như ghi chú sau nó bị mắc kẹt trong các cam kết trong lịch sử cam kết. Thông thường họ chỉ đến đỉnh của một loạt các cam kết, nhưng chúng có thể được di chuyển xung quanh với git checkouthoặc git resetvv


Từ đây: "Mỗi cái đầu có một tên". Và "một đầu được chọn là đầu hiện tại. Cái đầu này được đặt bí danh là ĐẦU ". Vì vậy, tôi kết luận từ điều này rằng "ĐẦU" không đề cập đến tình trạng của trạng thái "tách rời".
gxyd

1
@gxyd nếu đó là trường hợp mà ĐẦU không chỉ vào 'đầu', thì đó là một ĐẦU tách rời. Nó đang trỏ vào id xác nhận của xác nhận mà bạn đã chỉ định (ví dụ: bằng cách sử dụng git checkout HEAD~2), không phải là id cam kết của một đầu đã biết. Xem bài viết tại eagain.net/articles/git-for-computer-scientists để được giải thích kỹ hơn.
Silfheed

1
@Silfheed: Nói chung tôi nghĩ rằng câu trả lời này về mặt khái niệm nhiều âm thanh hơn so với câu được chấp nhận (mặc dù sử dụng "đầu" chữ thường để chỉ một chi nhánh khiến nhiều người nhầm lẫn). Tuy nhiên, git revertđây không phải là một ví dụ điển hình về việc chuyển một nhánh thành không nằm ở đầu, bởi vì git revertchỉ cần tạo một số cam kết mới và vẫn để lại nhánh hiện tại ở đầu (mới).
LarsH

1
"không phải là id xác nhận của một cái đầu đã biết" - Trên thực tế, một Head tách rời có thể được trỏ vào một ID xác nhận cũng là ID xác nhận của một cái đầu đã biết (hoặc một vài cái đầu). Điều làm cho nó tách ra là ĐẦU đang trỏ trực tiếp vào ID xác nhận, không phải vào đầu. Điều này sẽ ảnh hưởng đến hành vi của tương lai commits, resets, vv
LarsH

1
@LarsH: Điểm hay trên một ĐẦU tách rời chỉ vào ID cam kết thay vì tham chiếu. Bạn thực sự có thể xác minh điều này bằng cách xem .git / HEAD. Nếu nó bị tách ra, nó sẽ chứa hàm băm của một cam kết, ngay cả khi đó là cùng một cam kết với một đầu đã biết. Nếu được đính kèm, nó sẽ chứa đường dẫn đến đầu (tức là 'ref: refs / Heads / bob'). Đối với lệnh hoàn nguyên, sau 8 năm tôi không bao giờ bắt gặp lỗi đánh máy đó. Thiết lập lại Git là những gì cho phép bạn điều chỉnh một đầu cụ thể để trỏ đến một cam kết cụ thể.
Silfheed

62

Tôi khuyến nghị định nghĩa này từ nhà phát triển github Scott Chacon [ tham khảo video ]:

Đầu là chi nhánh hiện tại của bạn. Nó là một tài liệu tham khảo mang tính biểu tượng. Nó là một tài liệu tham khảo cho một chi nhánh. Bạn luôn có ĐẦU, nhưng ĐẦU sẽ chỉ vào một trong những con trỏ khác này, đến một trong những nhánh bạn đang ở. Nó là cha mẹ của cam kết tiếp theo của bạn. Đó là những gì nên được kiểm tra lần cuối vào thư mục làm việc của bạn ... Đây là trạng thái được biết đến cuối cùng của thư mục làm việc của bạn.

Toàn bộ video sẽ giới thiệu công bằng cho toàn bộ hệ thống git, vì vậy tôi cũng khuyên bạn nên xem tất cả nếu có thời gian.


34
Vì vậy, def thực sự là "cha mẹ của cam kết tiếp theo của bạn"
nicolas

1
và cũng là "thứ chỉ vào nhánh tiếp theo sẽ di chuyển"
nicolas

@nicolas - Tôi không nghĩ đó là sự thật. ĐẦU có thể trỏ vào bất kỳ cam kết nào, không nhất thiết phải trỏ vào một nhánh - khi không có, bạn đang ở chế độ "tách rời ĐẦU".
scubbo

23
Video này rất hay, nhưng thật không may, nó tạo ra một câu trả lời không phù hợp cho Stack Overflow. Điều gì xảy ra nếu video bị gỡ xuống đôi khi trong tương lai? Sau đó, liên kết của bạn sẽ trỏ đến không có gì. Một câu trả lời tốt hơn sẽ bao gồm một bản ghi lại những gì Scott nói trong video.

2
Scott nói rằng HEAD là một con trỏ đến một nhánh. Nhưng ĐẦU cũng có thể chỉ ra các cam kết cũ. Điều này thật khó hiểu.
Fixee

60

HEAD chỉ là một con trỏ đặc biệt trỏ đến nhánh cục bộ mà bạn hiện đang ở.

Từ sách Pro Git , chương 3.1 Phân nhánh Git - Các nhánh trong một Nutshell , trong phần Tạo một nhánh mới :

Điều gì xảy ra nếu bạn tạo một chi nhánh mới? Vâng, làm như vậy tạo ra một con trỏ mới để bạn di chuyển xung quanh. Giả sử bạn tạo một nhánh mới gọi là thử nghiệm. Bạn làm điều này với lệnh git nhánh:

$ git branch testing 

Điều này tạo ra một con trỏ mới tại cùng một cam kết mà bạn hiện đang trên

nhập mô tả hình ảnh ở đây

Làm thế nào để Git biết bạn đang ở chi nhánh nào? Nó giữ một con trỏ đặc biệt gọi là CHÍNH. Lưu ý rằng điều này khác rất nhiều so với khái niệm CHÍNH trong các VCS khác mà bạn có thể đã quen, chẳng hạn như Subversion hoặc CVS. Trong Git, đây là một con trỏ tới nhánh cục bộ mà bạn hiện đang ở. Trong trường hợp này, bạn vẫn đang làm chủ. Lệnh git nhánh chỉ tạo một nhánh mới - nó không chuyển sang nhánh đó.

nhập mô tả hình ảnh ở đây


4
Thật tuyệt, có thể sử dụng một hình ảnh cho thấy trường hợp CHÍNH bị tách ra
Don hatch

@DonHatch, Tốt giải thích về tách ĐẦU stackoverflow.com/a/35301963/1074179
Alexandr

3
Câu trả lời tốt đẹp. Các chi nhánh không có gì ngoài các cam kết được gắn nhãn, khi bạn thực hiện các cam kết mới, nhãn này được chuyển sang cam kết mới. Khi bạn kiểm tra một cam kết không có nhãn, nó sẽ ở trạng thái CHÍNH. Điều đó có nghĩa là CHÍNH đang chỉ đến một cam kết không có nhãn chi nhánh. Nếu bạn thanh toán 34ac2trong ví dụ trên, thì bây giờ CHÍNH sẽ chỉ vào cam kết đó và nó được gọi là ĐẦU tách rời. Ở trạng thái này, bạn cũng có thể thực hiện thay đổi, thử nghiệm và cam kết thay đổi, nhưng một khi bạn kiểm tra một nhánh khác, bạn sẽ mất tất cả các thay đổi của mình, trừ khi tất nhiên bạn tạo một nhánh mới.
Sleepwalkerfx

1
@sadwalkerfx nhưng bạn có thể kiểm tra một cam kết có nhãn chi nhánh và vẫn ở trạng thái tách rời vì ĐẦU của bạn không còn trỏ đến nhãn chi nhánh mà là id cam kết của chi nhánh
Marc

1
@saddwalkerfx Tôi nghĩ rằng chúng ta đang nói về ngữ nghĩa vào thời điểm này. Bạn đúng là một nhãn nhánh là một tham chiếu văn bản đến một cam kết cụ thể. Đó là, tuy nhiên, không phải là một cam kết. Vì vậy, nếu bạn đã làm một git logvà có một cái gì đó như thế commit ad0265... HEAD -> foo ...có nghĩa là foochi nhánh là một tham chiếu để xác nhận id ad0265. Làm một kiểm tra của tài liệu tham khảo văn bản fookhông phải là một đầu tách ra. Thực hiện kiểm tra id cam kết ad0265sẽ dẫn đến một cái đầu tách ra. Có thể tôi đang thiếu một chút tinh tế trong những gì bạn đang truyền đạt. Tôi hy vọng bức tường văn bản này sẽ giúp khám phá nơi tôi bị lạc.
Marc

40

Giả sử nó không phải là một trường hợp đặc biệt gọi là "ĐẦU tách rời", như đã nêu trong cuốn sách O'Reilly Git, ấn bản thứ 2, tr69, HEADcó nghĩa là:

HEADluôn đề cập đến các cam kết gần đây nhất trên chi nhánh hiện tại. Khi bạn thay đổi chi nhánh, HEADđược cập nhật để tham khảo cam kết mới nhất của chi nhánh mới.

vì thế

HEAD"mẹo" của chi nhánh hiện tại .

Lưu ý rằng chúng ta có thể sử dụng HEADđể tham khảo các cam kết gần đây nhất và sử dụng HEAD~như cam kết trước mẹo và HEAD~~hoặc HEAD~2như cam kết thậm chí sớm hơn, v.v.


27

Có một quan niệm sai lầm, có lẽ tinh tế, nhưng quan trọng trong một số những câu trả lời này. Tôi nghĩ tôi sẽ thêm câu trả lời của mình để làm sáng tỏ nó.

HEAD

Trưởng là BẠN

HEADlà một tài liệu tham khảo mang tính biểu tượng chỉ ra bất cứ nơi nào bạn đang ở trong lịch sử cam kết của mình. Nó theo bạn bất cứ nơi nào bạn đi, bất cứ điều gì bạn làm, như một cái bóng. Nếu bạn thực hiện một cam kết, HEADsẽ di chuyển. Nếu bạn kiểm tra một cái gì đó, HEADsẽ di chuyển. Dù bạn làm gì, nếu bạn đã chuyển đi đâu đó mới trong lịch sử cam kết của mình, HEADđã di chuyển cùng với bạn. Để giải quyết một quan niệm sai lầm phổ biến: bạn không thể tách rời khỏi HEAD. Đó không phải là một trạng thái CHÍNH tách rời. Nếu bạn từng thấy mình suy nghĩ: "ồ không, tôi đang ở trạng thái TUYỆT VỜI! Tôi đã mất ĐẦU!" Hãy nhớ rằng, đó là ĐẦU của bạn. TRƯỚC là bạn. Bạn chưa tách ra khỏi ĐẦU, bạn và ĐẦU của bạn đã tách ra khỏi thứ khác.

Đầu có thể gắn vào cái gì?

HEADcó thể chỉ ra một cam kết, có, nhưng thông thường thì không. Hãy để tôi nói rằng một lần nữa. Thông thường HEADkhông chỉ ra một cam kết. Nó trỏ đến một tài liệu tham khảo chi nhánh. Nó được gắn vào nhánh đó và khi bạn làm một số thứ nhất định (ví dụ, commithoặc reset), nhánh đính kèm sẽ di chuyển cùng HEAD. Bạn có thể thấy những gì nó đang chỉ bằng cách nhìn dưới mui xe.

cat .git/HEAD

Thông thường bạn sẽ nhận được một cái gì đó như thế này:

ref: refs/heads/master

Đôi khi bạn sẽ nhận được một cái gì đó như thế này:

a3c485d9688e3c6bc14b06ca1529f0e78edd3f86

Đó là những gì xảy ra khi HEADđiểm trực tiếp đến một cam kết. Điều này được gọi là một ĐẦU tách ra, bởi vì HEADđang chỉ đến một cái gì đó không phải là một tham chiếu chi nhánh. Nếu bạn thực hiện một cam kết trong trạng thái này master, không còn được gắn bó HEAD, sẽ không còn di chuyển cùng với bạn. Không quan trọng cam kết đó ở đâu. Bạn có thể ở cùng một cam kết với nhánh chính của bạn, nhưng nếu HEADchỉ vào cam kết chứ không phải là nhánh, nó sẽ bị tách ra và một cam kết mới sẽ không được liên kết với tham chiếu nhánh.

Bạn có thể nhìn vào đồ họa này nếu bạn thử bài tập sau. Từ một kho lưu trữ git, chạy này. Bạn sẽ nhận được một cái gì đó hơi khác nhau, nhưng các bit chính của họ sẽ ở đó. Khi đến lúc kiểm tra cam kết trực tiếp, chỉ cần sử dụng bất kỳ hàm băm viết tắt nào bạn nhận được từ đầu ra đầu tiên (đây là a3c485d).

git checkout master
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD -> master)

git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h:  %d" -1   
# a3c485d:   (HEAD, master)

OK, do đó, có một sự khác biệt nhỏ trong đầu ra ở đây. Kiểm tra cam kết trực tiếp (thay vì chi nhánh) cho chúng ta dấu phẩy thay vì mũi tên. Bạn nghĩ gì, chúng ta đang ở trong một trạng thái CHÍNH? HEAD vẫn đang đề cập đến một sửa đổi cụ thể được liên kết với một tên chi nhánh. Chúng ta vẫn trong nhánh chính, phải không?

Bây giờ cố gắng:

git status
# HEAD detached at a3c485d

Không. Chúng tôi đang ở trạng thái 'tách ra'.

Bạn có thể thấy cùng một đại diện (HEAD -> branch)so (HEAD, branch)với git log -1.

Tóm lại là

HEADlà bạn. Nó chỉ ra bất cứ điều gì bạn đã kiểm tra, bất cứ nơi nào bạn đang có. Thông thường đó không phải là một cam kết, nó là một chi nhánh. Nếu HEAD không trỏ đến một cam kết (hoặc thẻ), ngay cả khi đó là cùng một cam kết (hoặc thẻ) mà một nhánh cũng trỏ đến, thì bạn (và HEAD) đã bị tách ra khỏi nhánh đó. Vì bạn không có chi nhánh gắn liền với mình, nên chi nhánh sẽ không đi theo bạn khi bạn thực hiện các cam kết mới. HEAD, tuy nhiên, sẽ.


1
Tôi thích câu trả lời này, bởi vì trong khi tài liệu mô tả sự thật, phần mềm định nghĩa sự thật. .git/HEADlà những gì phần mềm coi là CHÍNH.
Don Branson

2
Đối với định nghĩa khái niệm của nó một mình, đây nên là câu trả lời được chấp nhận.
ata

22

HEADđề cập đến cam kết hiện tại mà bản sao làm việc của bạn trỏ đến, tức là cam kết mà bạn hiện đã thanh toán. Từ tài liệu Linux Kernel chính thức về việc chỉ định các bản sửa đổi Git :

HEAD Đặt tên cho cam kết mà bạn dựa trên các thay đổi trong cây làm việc.

Tuy nhiên, lưu ý rằng trong phiên bản 1.8.4 sắp tới của Git, @cũng có thể được sử dụng như một cách viết tắt HEAD, như được lưu ý bởi người đóng góp Git Junio ​​C Hamano trong blog Git Blame của mình :

Thay vì gõ "ĐẦU", bạn có thể nói "@", ví dụ: "git log @".

Người dùng Stack Overflow VonC cũng tìm thấy một số thông tin thú vị về lý do tại sao @được chọn làm tốc ký trong câu trả lời của mình cho câu hỏi khác .

Ngoài ra, trong một số môi trường, không cần thiết phải viết hoa HEAD, đặc biệt là trong các hệ điều hành sử dụng các hệ thống tệp không phân biệt chữ hoa chữ thường, cụ thể là Windows và OS X.


17

Hãy xem Tạo và chơi với các chi nhánh

HEAD thực sự là một tệp có nội dung xác định trong đó biến HEAD đề cập đến:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

Trong kho lưu trữ này, nội dung của tệp CHÍNH đề cập đến tệp thứ hai có tên refs / Heads / master . Tệp refs / Heads / master chứa hàm băm của lần xác nhận gần đây nhất trên nhánh chính.

Kết quả là các điểm CHÍNH đến cam kết nhánh chính từ tệp .git / refs / Heads / master .

nhập mô tả hình ảnh ở đây


1
Cẩn thận: Liên kết gitguys.com dường như trỏ đến một tên miền chưa sử dụng.
MKesper

14

Tôi chỉ muốn nói chi tiết một vài điều trong câu trả lời được chấp nhận của Greg Hewgil. Theo Hướng dẫn bỏ túi Git

Chi nhánh:

bản thân nhánh được định nghĩa là tất cả các điểm có thể truy cập trong biểu đồ xác nhận từ cam kết được đặt tên (mẹo tip của nhánh).

ĐẦU: Một loại Ref đặc biệt

Giới thiệu đặc biệt xác định chi nhánh bạn đang ở ...

Tham chiếu

Git định nghĩa hai loại tài liệu tham khảo, hoặc con trỏ được đặt tên, mà nó gọi là ref refs:

  • Một ref đơn giản, trỏ trực tiếp vào ID đối tượng (thường là một cam kết hoặc thẻ)
  • Một ref mang tính biểu tượng (hoặc symref), trỏ đến một ref khác (đơn giản hoặc tượng trưng)

Như Greg đã đề cập, HEAD có thể ở trong "trạng thái tách rời". Vì vậy, HEAD có thể là một ref đơn giản (đối với một HEAD tách rời) hoặc symref.

nếu HEAD là một ref mang tính biểu tượng cho một nhánh hiện có, thì bạn là người trên nhánh đó. Mặt khác, nếu HEAD là một ref đơn giản trực tiếp đặt tên cho một cam kết bằng ID SHA-1 của nó, thì bạn không phải là trên bất kỳ chi nhánh nào, mà là trong chế độ ĐẦU tách rời, xuất hiện khi bạn kiểm tra một số trước đó cam kết kiểm tra.


Cảm ơn bạn, @mike! Đây là câu trả lời đầu tiên làm rõ những gì xảy ra khi bạn kiểm tra một cam kết trước đó. Nhìn vào cuốn sách trên trang web git, tôi có ấn tượng rằng một "ĐẦU tách rời" là một trạng thái bệnh lý mà bạn chỉ mắc phải nếu bạn làm một số điều nổi loạn kỳ lạ. Nhưng kiểm tra một cam kết trước đó không phải là một điều lạ và khi bạn làm điều đó, thì ĐẦU không phải là "mẹo của chi nhánh hiện tại". Vì vậy, đây là lần đầu tiên tôi cảm thấy mình thực sự hiểu.
Nat Kuhn

7

Tôi nghĩ rằng 'ĐẦU' là kiểm tra cam kết hiện tại. Nói cách khác, 'ĐẦU' chỉ vào cam kết hiện đang được kiểm tra.

Nếu bạn vừa nhân bản và chưa kiểm tra, tôi không biết nó trỏ đến cái gì, có thể là một số vị trí không hợp lệ.


Có, tài liệu tham khảo đặc biệt HEADlà bất kỳ cam kết nào bạn hiện đã thanh toán. Xem hướng dẫn để biết chi tiết (đoạn liên quan ngay sau Hình 3.4).
Calrion

1
Nếu bạn sao chép một kho lưu trữ, git theo mặc định sẽ kiểm tra masternhánh - vì vậy, HEAD sẽ trỏ đến master.
sleske

1
@sleske nếu bạn sao chép một kho lưu trữ không có tùy chọn đặc biệt, git sẽ kiểm tra đầu từ xa. nó thường master, nhưng không phải lúc nào cũng vậy. Xemremote set-head
De Novo

Nhận xét trước đây của tôi là chính xác ngoại trừ tham chiếu đến remote set-head, chỉ tác động đến nhánh mặc định cục bộ và sẽ không thay đổi mặc định tại máy chủ.
De Novo

5

Đầu chỉ vào đầu của chi nhánh hiện đang kiểm tra.

nhập mô tả hình ảnh ở đây

Trong kho lưu trữ của bạn, có một thư mục .git. Mở tệp ở vị trí này: .git \ refs \ Heads. Mã (băm sha-1) trong tệp đó (chính trong hầu hết các trường hợp) sẽ là lần xác nhận gần đây nhất, tức là mã được thấy trong đầu ra của lệnh git log. Thông tin thêm về thư mục .git: http : // git yet.com/advified/2009/03/23/whats-inside-your-git-directory.html


1
Đó là một quan niệm sai lầm phổ biến rằng tiền boa của chi nhánh hiện tại chỉ ra cam kết gần đây nhất. Điển hình là điều đó đúng, nhưng nó cũng không có gì lạ git reset HEAD^, và sau đó, cam kết gần đây nhất (mẹo trước đây) không còn được chỉ ra bởi đầu cành.
LarsH

4

Một cách tuyệt vời để lái xe về nhà điểm được đưa ra trong các câu trả lời chính xác là chạy git reflog HEAD, bạn có được một lịch sử của tất cả các địa điểm mà CHÍNH đã chỉ ra.


4

Sau khi đọc tất cả các câu trả lời trước đó, tôi vẫn muốn rõ ràng hơn. Blog này tại trang web chính thức của git http://git-scm.com/blog đã cho tôi những gì tôi đang tìm kiếm:

Đầu: Con trỏ đến ảnh chụp nhanh cam kết cuối cùng, cha mẹ tiếp theo

Đầu trong Git là con trỏ tới tham chiếu nhánh hiện tại, lần lượt là một con trỏ đến lần xác nhận cuối cùng bạn đã thực hiện hoặc lần xác nhận cuối cùng đã được kiểm tra trong thư mục làm việc của bạn. Điều đó cũng có nghĩa nó sẽ là cha mẹ của lần cam kết tiếp theo bạn làm. Nói chung đơn giản nhất khi nghĩ về nó vì CHÍNH là ảnh chụp nhanh về cam kết cuối cùng của bạn.


1
TRƯỚC: ảnh chụp cam kết cuối cùng, cha mẹ tiếp theo không chính xác. HEADkhông phải là một cam kết; nó chỉ đến một.
jub0bs

Không cần mỉa mai; trước khi chỉnh sửa của bạn, mặc dù trích dẫn là chính xác, các chữ in đậm lớn là một sự đơn giản hóa và một chút sai lệch. Giờ thì tốt hơn rồi đó.
jub0bs

1
NẾU bạn đọc dòng tiếp theo: ĐẦU trong Git là con trỏ tới tham chiếu nhánh hiện tại, lần lượt là một con trỏ đến lần xác nhận cuối cùng bạn thực hiện hoặc lần xác nhận cuối cùng được kiểm tra trong thư mục làm việc của bạn. - Xin lưu ý việc sử dụng từ "con trỏ" ở đó.
dùng3751385

Mặc dù mô tả "ảnh chụp nhanh cam kết cuối cùng" mang lại cảm giác khái niệm về cách sử dụng thường được sử dụng, nhưng nó thực sự không chính xác. Nếu tôi thực hiện một cam kết, sau đó chuyển sang một chi nhánh khác, HEAD sẽ không trỏ đến ảnh chụp nhanh cam kết cuối cùng nữa. Nó trỏ đến ảnh chụp nhanh cam kết cuối cùng trên nhánh tôi vừa chuyển sang. Nếu tôi checkout HEAD^, bây giờ CHÍNH thậm chí không trỏ đến ảnh chụp nhanh cam kết cuối cùng trên bất kỳ chi nhánh nào.
LarsH

"Cha mẹ của cam kết tiếp theo của bạn (nếu bạn đã cam kết ngay bây giờ)" thì chính xác hơn, nhưng có nhiều hoạt động khác trong git bên cạnh cam kết bị ảnh hưởng bởi CHÍNH. Thực sự, cuối cùng, HEAD là HEAD, và bản chất của nó được xác định bởi cách nó ảnh hưởng đến lệnh như commit, merge, rebase, log, vv Tuy nhiên, khái niệm có thể "(con trỏ tới) vị trí hiện tại" là một bản tóm tắt tốt.
LarsH

3

Cảm giác như đó HEADchỉ là một thẻ cho lần xác nhận cuối cùng mà bạn đã kiểm tra.

Đây có thể là đỉnh của một nhánh cụ thể (chẳng hạn như "chính") hoặc một số cam kết ở giữa của một nhánh ("đầu tách rời")


1

Ngoài tất cả các định nghĩa, điều mắc kẹt trong tâm trí tôi là, khi bạn thực hiện một cam kết, GIT tạo ra một đối tượng cam kết trong kho lưu trữ. Các đối tượng cam kết nên có một cha mẹ (hoặc nhiều cha mẹ nếu đó là một cam kết hợp nhất). Bây giờ, làm thế nào để git biết cha mẹ của cam kết hiện tại? Vì vậy, HEAD là một con trỏ tới (tham chiếu của) cam kết cuối cùng sẽ trở thành cha mẹ của cam kết hiện tại.


0

Hai điều này có thể làm bạn bối rối:

cái đầu

Chỉ vào tài liệu tham khảo có tên một chi nhánh được gửi gần đây. Trừ khi bạn sử dụng tham chiếu gói, các đầu thường được lưu trữ trong $ GIT_DIR / refs / Heads /.

CÁI ĐẦU

Nhánh hiện tại hoặc cây làm việc của bạn thường được tạo từ cây CHÍNH đang trỏ tới. Đầu phải chỉ vào một đầu, ngoại trừ bạn đang sử dụng một đầu tách rời.


0

Hãy xem http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

Hình 3-5. Tập tin CHÍNH chỉ vào chi nhánh bạn đang ở.


4
Các câu trả lời chỉ liên kết thường được tán thành trên Stackoverflow, vui lòng nội tuyến các thông tin liên quan trong câu trả lời của bạn.
HaskellElephant

2
Điều này không hoàn toàn chính xác. Những gì HEADđề cập đến phụ thuộc vào việc bạn đang nói về một repo trần so với một repo không trần. Trong ngữ cảnh của một repo không trần, nó thực sự đề cập đến cam kết hiện đã thanh toán, không yêu cầu phải có một nhánh gắn liền với nó (tức là khi ở HEADtrạng thái tách rời ).

0

Một nhánh thực sự là một con trỏ chứa ID xác nhận, chẳng hạn như 17a5 . CÁI ĐẦU là một con trỏ tới một nhánh mà người dùng hiện đang làm việc.

CÁI ĐẦU có một filw tham chiếu trông như thế này:

tham chiếu:

Bạn có thể kiểm tra các tệp này bằng cách truy cập .git/HEAD .git/refsvào kho lưu trữ mà bạn đang làm việc.


0

Gitlà tất cả về cam kết.
Headtrỏ đến cam kết mà bạn hiện đang kiểm tra.

$ git cat-file -t HEAD
commit

Bất cứ khi nào bạn kiểm tra một chi nhánh, CHÍNH chỉ đến cam kết mới nhất trên chi nhánh đó. Nội dung của HEAD có thể được kiểm tra như bên dưới (đối với nhánh chính):

$ cat .git/refs/heads/master
  b089141cc8a7d89d606b2f7c15bfdc48640a8e25

-5

Là một khái niệm, người đứng đầu là phiên bản mới nhất trong một chi nhánh. Nếu bạn có nhiều hơn một đầu trên mỗi nhánh có tên, bạn có thể đã tạo nó khi thực hiện các cam kết cục bộ mà không hợp nhất, tạo hiệu quả một nhánh không tên.

Để có kho lưu trữ "sạch", bạn nên có một đầu cho mỗi nhánh được đặt tên và luôn hợp nhất với một nhánh được đặt tên sau khi bạn làm việc tại địa phương.

Điều này cũng đúng với Mercurial .


4
Điều này đúng với Mercurial, nhưng không đúng với Git.
Tái lập lại Monica - notmaynard
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.