Lưu ý đầu tiên rằng câu hỏi của bạn cho thấy một chút hiểu lầm. origin / HEAD đại diện cho nhánh mặc định trên remote , tức là HEAD trong kho lưu trữ từ xa mà bạn đang gọi origin. Khi bạn chuyển nhánh trong repo của mình, bạn sẽ không ảnh hưởng đến điều đó. Điều tương tự cũng đúng với các chi nhánh từ xa; bạn có thể có master
và origin/master
trong repo của bạn, nơi origin/master
đại diện cho một bản sao cục bộ của master
chi nhánh trong kho lưu trữ từ xa.
Head của origin sẽ chỉ thay đổi nếu bạn hoặc người khác thực sự thay đổi nó trong kho lưu trữ từ xa , điều này về cơ bản sẽ không bao giờ xảy ra - bạn muốn nhánh mặc định là repo công khai không đổi, trên nhánh ổn định (có thể là master). origin / HEAD là một ref cục bộ đại diện cho một bản sao cục bộ của HEAD trong kho lưu trữ từ xa. (Tên đầy đủ của nó là refs / điều khiển từ xa / nguồn gốc / ĐẦU.)
Tôi nghĩ các câu trả lời ở trên là những gì bạn thực sự muốn biết, nhưng để tiếp tục và trả lời câu hỏi bạn đã hỏi rõ ràng ... origin / HEAD được đặt tự động khi bạn sao chép một kho lưu trữ, và đó là về nó. Kỳ lạ thay, nó không được thiết lập bởi các lệnh như git remote update
- tôi tin rằng cách duy nhất nó sẽ thay đổi là nếu bạn thay đổi thủ công. (Bằng cách thay đổi, tôi có nghĩa là trỏ đến một nhánh khác; rõ ràng là cam kết nó sẽ thay đổi nếu nhánh đó thay đổi, điều này có thể xảy ra khi tìm nạp / kéo / cập nhật từ xa.)
Chỉnh sửa : Vấn đề được thảo luận dưới đây đã được sửa trong Git 1.8.4.3 ; thấy bản cập nhật này .
Có một cảnh báo nhỏ, mặc dù. HEAD là một ref mang tính biểu tượng, chỉ vào một nhánh thay vì trực tiếp đến một cam kết, nhưng các giao thức truyền từ xa git chỉ báo cáo các cam kết cho các ref. Vì vậy, Git biết SHA1 của cam kết được chỉ ra bởi HEAD và tất cả các giới thiệu khác; sau đó nó phải suy ra giá trị của HEAD bằng cách tìm một nhánh trỏ đến cùng một cam kết. Điều này có nghĩa là nếu hai nhánh xảy ra ở đó, điều đó không rõ ràng. (Tôi tin rằng nó chọn chủ nếu có thể, sau đó quay lại bảng chữ cái đầu tiên.) Bạn sẽ thấy điều này được báo cáo trong đầu ra của git remote show origin
:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
Điều kỳ lạ là, mặc dù khái niệm ĐẦU được in theo cách này sẽ thay đổi nếu mọi thứ thay đổi trên điều khiển từ xa (ví dụ: nếu foo bị xóa), nó không thực sự cập nhật refs/remotes/origin/HEAD
. Điều này có thể dẫn đến những tình huống thực sự kỳ quặc. Giả sử trong ví dụ trên origin / HEAD thực sự đã trỏ đến foo và nhánh foo của origin sau đó đã bị xóa. Sau đó chúng ta có thể làm điều này:
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
Vì vậy, mặc dù chương trình từ xa biết rằng CHÍNH là chủ, nhưng nó không cập nhật bất cứ điều gì. Nhánh foo cũ kỹ được cắt tỉa chính xác và HEAD trở nên lơ lửng (chỉ vào một nhánh không tồn tại), và nó vẫn không cập nhật nó để trỏ đến chủ. Nếu bạn muốn sửa lỗi này, hãy sử dụng git remote set-head origin -a
, nó sẽ tự động xác định CHÍNH của nguồn gốc như trên, và sau đó thực sự đặt gốc / ĐẦU để trỏ đến nhánh từ xa thích hợp.
refs/origin/HEAD
. Đây không phải là cáchHEAD
thiết lập tham chiếu tượng trưng của kho lưu trữ .