Tại sao nguồn gốc / ĐẦU TIẾNG hiển thị khi chạy nhánh Git -r?


160

Khi bạn chạy git branch -rtại sao blazes nó liệt kê origin/HEAD? Ví dụ: có một repo từ xa trên GitHub, giả sử, với hai nhánh: tính năng chính và tuyệt vời. Nếu tôi làm git cloneđể lấy nó và sau đó đi vào thư mục mới của tôi và liệt kê các nhánh, tôi thấy điều này:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

Hoặc bất cứ thứ tự nào nó sẽ được (alpha? Tôi giả mạo ví dụ này để giữ bí mật danh tính của một repo vô tội). Vậy HEADkinh doanh là gì? Đó có phải là những gì người cuối cùng pushđã HEADchỉ vào khi họ đẩy? Không phải lúc nào họ cũng pushvậy sao? HEADs di chuyển xung quanh ... tại sao tôi quan tâm những gì ai đó HEADchỉ vào máy khác?

Tôi chỉ cần xử lý theo dõi từ xa và như vậy, vì vậy đây là một sự nhầm lẫn kéo dài. Cảm ơn!

EDIT: Tôi có ấn tượng rằng các repos từ xa chuyên dụng (như GitHub, nơi không ai sẽ ssh in và làm việc với mã đó, nhưng chỉ kéo hoặc đẩy, v.v.) đã không và không nên có ĐẦU vì về cơ bản, có, không có bản sao làm việc Không phải vậy sao?


Câu trả lời:


140

@robinst là chính xác.

Trong git, bạn có thể chọn nhánh nào được kiểm tra theo mặc định (nghĩa là khi bạn sao chép). Theo mặc định, origin/HEADsẽ chỉ vào đó.

Trên GitHub, Bạn có thể thay đổi điều này trong cài đặt Quản trị viên cho repo GitHub của bạn. Bạn cũng có thể làm điều đó từ dòng lệnh thông qua

git remote set-head origin trunk

hoặc xóa nó hoàn toàn thông qua

git remote set-head origin -d

Ví dụ . Nhìn vào trình đơn thả xuống 'Chuyển nhánh'. trunkđược kiểm tra, như origin/HEADsau trunk.


Tôi đổi tên một điều khiển từ xa khác originvà tôi otherremote/HEAD -> masterđang làm phiền tôi. Chạy lệnh của bạn đã sửa nó cho tôi.
Felipe Alvarez

59

Lý do một kho lưu trữ trần có thể có một ĐẦU, là bởi vì nó xác định nhánh nào được kiểm tra ban đầu sau một bản sao của kho lưu trữ.

Thông thường, HEAD trỏ đến master và đó là nhánh được kiểm tra khi mọi người sao chép kho lưu trữ. Đặt nó thành một nhánh khác (bằng cách chỉnh sửa HEAD trong kho lưu trữ trần) dẫn đến nhánh đó được kiểm tra trên bản sao.


2
Bởi vì có thể loại bỏ tham chiếu này mà không cần đẩy, origin/HEADmột tham chiếu cục bộ có đúng không? Liệu loại bỏ nó có ảnh hưởng đến origin?
Zach Posten

@zposten: Không, giống như cách xóa origin/masterkhông ảnh hưởng đến điều khiển từ xa.
cướp

Điều đó có nghĩa là sau khi nhân bản tài liệu tham khảo chỉ là một thông tin vô dụng.
Bachsau

@Bachsau tài liệu tham khảo không được nhân bản.
cướp

27

Tôi có ấn tượng rằng các repos từ xa chuyên dụng (như GitHub, nơi không ai sẽ ssh in và làm việc với mã đó, nhưng chỉ kéo hoặc đẩy, v.v.) đã không và không nên có ĐẦU vì về cơ bản, không hoạt động bản sao. Không phải vậy sao?

Tôi đã có cùng một ấn tượng như bạn nói.

Và tôi thậm chí không thể xóa gốc / nhánh đó theo dõi từ xa được sao chép từ github bằng cách thực hiện

git branch -d -r origin/HEAD

Điều này không có tác dụng.

Ai đó có thể cho tôi biết làm thế nào tôi có thể xóa chi nhánh theo dõi từ xa / gốc đó không?

cập nhật

Mặc dù tôi không tìm thấy lý do tại sao có một nguồn gốc / ĐẦU được tạo khi sao chép từ github, tôi tìm cách xóa nó.

Phiên bản mới của git cung cấp

git remote set-head <name> -d

để xóa con trỏ CHÍNH vô dụng của nhánh theo dõi từ xa.

Và chúng ta cũng có thể thay đổi tên mặc định 'gốc' thành bất cứ thứ gì chúng ta muốn bằng cách sử dụng

git remote rename origin <new_name>

Hy vọng điều này có thể giúp đỡ. :)


Tôi đang gặp vấn đề tương tự (thậm chí trên GitHub) và bộ đầu không hoạt động. Tôi có nên chạy 'git set-head head -d' không?
Joost Schuur

5
@Joost: đó làgit remote set-head origin -d
znq

13

Bạn đúng khi đẩy các repos từ xa chuyên dụng hoạt động tốt hơn nhiều khi chúng ở trạng thái trống, nghĩa là khi chúng không có thư mục hoạt động. Kiến trúc của Git được thiết kế để cập nhật bằng các bản vá hoặc pull( fetch), có ý nghĩa trong một VCS phân tán. Như các tài liệu nói ở đâu đó, đẩy đến một chi nhánh hiện đang được kiểm tra có thể dẫn đến "kết quả không mong muốn" .

Đầu là một phần của các yêu cầu cho một kho lưu trữ hợp lệ. Giao diện kho lưu trữ Git cho biết, một phần:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Vì vậy, bạn sẽ thấy CHÍNH là một phần của danh sách chi nhánh, ngay cả khi "nó không có nghĩa nhiều ..."


Điều này không có ý nghĩa. Các kho lưu trữ bắt đầu trống nhưng ngay khi bạn đẩy thứ gì đó cho chúng, chúng không còn trống nữa và nếu bạn chạy "nhánh git" trên chúng, chúng sẽ hiển thị một nhánh đang được kiểm tra.
địa lý

@geoidesic Một kho lưu trữ có thể trống ngay cả khi bạn đã đẩy nó. Sau đây: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baređầu ra đúng. Ngoài ra, không có bản sao làm việc của tệp được đẩy trong foobar repo theo các lệnh đó.
Anders Lindén

@geoidesic Một kho lưu trữ có thể trống ngay cả khi bạn đã đẩy nó. Sau đây: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baređầu ra đúng. Ngoài ra, không có bản sao làm việc của tệp được đẩy trong foobar repo theo các lệnh đó.
Anders Lindén

@geoidesic A --bare git repo chỉ có nghĩa là một repo không có cây làm việc, tức là một repo chỉ chứa một thư mục .git, nhưng không thể có bất kỳ tệp nào được kiểm tra. Vì nó không thể có bất kỳ tệp nào được kiểm tra, nên nó thực sự thậm chí không có thư mục .git, nó chỉ đặt tất cả các tệp .git trực tiếp trong thư mục chính. Tạo một cái và bạn sẽ thấy!
00prometheus

5

Nếu "origin" là một kho lưu trữ từ xa, thì origin / HEAD xác định nhánh mặc định trên kho lưu trữ từ xa đó.

Thí dụ:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Lưu ý dòng có nội dung "Chi nhánh chính: chủ". Đây là nơi kho lưu trữ từ xa cho phép khách hàng biết chi nhánh nào cần thanh toán theo mặc định.


1

Luôn có một ĐẦU chỉ đến nhánh đang được kiểm tra trên repo từ xa (có thể là hoặc không thể là chủ). Ngay cả các kho lưu trữ từ xa có các chi nhánh hiện tại. Thông thường nó là chủ, và ngoài đỉnh đầu tôi không thể nghĩ ra bất kỳ lý do nào khiến người ta muốn thay đổi nó, nhưng nó có thể được thay đổi.


2
github repos không kiểm tra chi nhánh. Tôi không thấy lý do tại sao điều này sẽ áp dụng.
Dustin

Kho lưu trữ từ xa KHÔNG nên có một thư mục làm việc. Các kho lưu trữ từ xa phải là --bare và do đó không thể có một chi nhánh hiện đang được kiểm tra.
n4rzul

-14

Tôi đoán là ai đó đã đẩy một nhánh và gọi nó là ĐẦU:

git push origin HEAD

Tôi có thể nhận được một số ý kiến ​​về những gì sai với điều này? Nếu bạn muốn có nguồn gốc / ĐẦU trên github, đó là cách duy nhất tôi biết để đến đó.
Dustin

Đầu từ xa là một ref mang tính biểu tượng (thường là refs / Heads / master). Bạn sẽ thay thế tham chiếu tượng trưng bằng id băm của cam kết của chi nhánh hiện tại của bạn.
Daniel Fanjul

2
Không nên đoán được thảo luận trong các ý kiến ​​thay vì là một câu trả lời không chính xác?
Luciano
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.