git: sự khác biệt giữa "tên chi nhánh" và "refs / đầu / tên chi nhánh"


97

Tốt nhất nên được giải thích ở một ví dụ: Tôi đang ở chi nhánh 0,58 của kho lưu trữ và đây là cách tôi kéo:

git pull origin 0.58

Khi tôi chỉ gọi "git pull", tôi nhận được:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.0.58.remote = <nickname>
    branch.0.58.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

Có vẻ như tôi có thể đã quên một số tùy chọn (--track?) Khi tôi kiểm tra nhánh đó. Dù sao, tôi đã thiết lập điều này ngay bây giờ:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

Và điều này có vẻ hiệu quả. Sau đó, chỉ vì quan tâm, tôi đã xem một số nhánh khác về cài đặt này:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

Tôi đã tự hỏi bây giờ, có sự khác biệt giữa "0.58" hay tôi nên chỉ định "refs / heads / 0.58"?

Sự khác biệt chính xác là gì?


1
Chỉ để bổ sung lỗi đánh máy trong tiêu đề (mà không gây nhầm lẫn với tiêu đề cũ bằng cách sửa đổi nó ngay bây giờ) , nó phải đọc "refs / heads / branchname" , headsvới một "s".
RomainValeri

Câu trả lời:


129

A reflà bất kỳ thứ gì trỏ đến một cam kết, ví dụ, các nhánh (đầu), thẻ và các nhánh từ xa. Bạn sẽ thấy phần đầu, phần điều khiển từ xa và thẻ trong .git/refsthư mục của mình , giả sử bạn có cả ba loại tham chiếu trong kho lưu trữ của mình.

refs/heads/0.58chỉ định một nhánh có tên 0.58. Nếu bạn không chỉ định ref nằm trong vùng tên nào, git sẽ nằm trong vùng mặc định. Điều này làm cho chỉ sử dụng 0,58 có thể mơ hồ - bạn có thể có cả nhánh và thẻ có tên 0,58.


3
Cảm ơn rất nhiều, điều này giải thích nó rất tốt. Nó chỉ hoạt động với "0,58" đơn giản vì không có thẻ được đặt tên như vậy.
Albert

1
Đúng, về cơ bản nó sẽ luôn hoàn toàn ổn, nhưng thật tốt khi được an toàn.
Cascabel

Câu trả lời này là một kho báu. Cuối cùng ai đó giải thích về Git và tôi thích nó! Cảm ơn.
aderchox

9
Dưới đây là tất cả trong số họ cho rõ ràng: refs/heads/refs/remotes/refs/tags/
Jim Aho

41

Chỉ dành cho những người tò mò - git show-ref, có sẵn kể từ Git v1.8.2.2, sẽ hiển thị cho bạn tất cả các tài liệu tham khảo bạn có trong kho lưu trữ cục bộ của mình.


3
Đồng thời git log --decorate=fullsẽ hiển thị tên đầy đủ của các tài liệu tham khảo trong lịch sử
galath 12/10/18

19

Hãy xem, branchNamecần phải được giải quyết hoàn toàn trước khi GIT thực sự có thể xác định nó. Tên được giải quyết đầy đủ sẽ là refs/heads/branchName.

Một trong những lệnh nổi tiếng git checkout branchNamethực sự tự động giải quyết nó hoàn toàn để xác định nơi bạn muốn thanh toán. Lưu ý rằng nó tự động làm điều đó, do đó chúng tôi không bao giờ tự mình viết đầy đủ.

Sao làm được vậy ? Hãy để chúng tôi nhìn ở đây

refname :, ví dụ như master, heads/master,refs/heads/master

Tên giới thiệu tượng trưng. Ví dụ: master thường có nghĩa là đối tượng cam kết được tham chiếu bởi refs/heads/master. Nếu bạn tình cờ có cả hai heads/mastertags/master, bạn có thể nói rõ ràng heads/masterđể cho Git biết ý bạn là gì. Khi không rõ ràng, a <refname>được phân biệt bằng cách lấy so khớp đầu tiên trong các quy tắc sau:

1.If $GIT_DIR/<refname>tồn tại, đó là những gì bạn có ý nghĩa (điều này thường chỉ có ích cho HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADCHERRY_PICK_HEAD);

2. ngược lại, refs/<refname>nếu nó tồn tại;

3. ngược lại, refs/tags/<refname>nếu nó tồn tại;

4. ngược lại, refs/heads/<refname>nếu nó tồn tại;

5. ngược lại, refs/remotes/<refname>nếu nó tồn tại;

6. ngược lại, refs/remotes/<refname>/HEADnếu nó tồn tại.

Vì vậy, bằng 6 bước trên, nó cố gắng giải quyết đây là gì branchName. Do đó, chúng tôi không bao giờ cần phải cung cấp một branchName đã được phân giải đầy đủ cho nó.

Nhìn ở đâyở đây nữa.

Ngoài ra, hãy vào .gitthư mục của bạn và xem bên trong refthư mục.

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.