Do thẻ Git chỉ áp dụng cho chi nhánh hiện tại?


156

Tôi hiện đang làm việc với một kho lưu trữ có nhiều chi nhánh.

Khi tôi tạo một thẻ, thẻ đó có đề cập đến nhánh hiện tại không?

Nói cách khác: Bất cứ khi nào tôi tạo thẻ, tôi có cần chuyển sang nhánh mong muốn và thẻ bên trong nhánh đó để thẻ tham chiếu đến nhánh đó tại thời điểm đó không?

Câu trả lời:


151

Nếu bạn tạo một thẻ bằng vd

git tag v1.0

thẻ sẽ đề cập đến cam kết gần đây nhất của chi nhánh bạn hiện đang làm. Bạn có thể thay đổi chi nhánh và tạo một thẻ ở đó.

Bạn cũng có thể chỉ cần tham khảo các chi nhánh khác trong khi gắn thẻ,

git tag v1.0 name_of_other_branch

sẽ tạo thẻ cho cam kết gần đây nhất của nhánh khác.

Hoặc bạn có thể đặt thẻ ở bất cứ đâu, bất kể là chi nhánh nào, bằng cách tham chiếu trực tiếp đến SHA1 của một số cam kết

git tag v1.0 <sha1>

201

Câu trả lời của CharlesBcâu trả lời của helmbert đều hữu ích, nhưng tôi phải mất một thời gian để hiểu chúng. Đây là một cách khác để đặt nó:

  • Một thẻ là một con trỏ đến một cam kết , và cam kết tồn tại độc lập của chi nhánh .
    • Điều quan trọng là phải hiểu rằng các thẻ không có mối quan hệ trực tiếp với các chi nhánh - chúng chỉ xác định một cam kết .
      • Cam kết đó có thể được chỉ ra từ bất kỳ số lượng chi nhánh nào - nghĩa là, nó có thể là một phần của lịch sử của bất kỳ số lượng chi nhánh nào - bao gồm không có chi nhánh.
    • Do đó, chạy git show <tag> để xem chi tiết của thẻ không chứa tham chiếu đến bất kỳ chi nhánh nào, chỉ có ID của cam kết mà thẻ trỏ đến.
      • (ID cam kết (còn gọi là tên đối tượng hoặc ID SHA-1) là các chuỗi 40 ký tự bao gồm các chữ số hex. Băm trên nội dung của một cam kết; ví dụ 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2:)
  • Các chi nhánh chỉ hoạt động một cách gián tiếp :
    • Tại thời điểm tạo thẻ , bằng cách ngụ ý cam kết mà thẻ sẽ trỏ đến :
      • Không chỉ định mục tiêu cho thẻ mặc định cho cam kết gần đây nhất của chi nhánh hiện tại (còn gọi là CHÍNH); ví dụ:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Chỉ định tên chi nhánh làm mục tiêu thẻ mặc định cho cam kết gần đây nhất của chi nhánh đó; ví dụ:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Như những người khác đã lưu ý, bạn cũng có thể chỉ định rõ ràng ID cam kết làm mục tiêu của thẻ.)
    • Khi sử dụng git describeđể mô tả chi nhánh hiện tại:
      • git describe [--tags] mô tả chi nhánh hiện tại theo các cam kết kể từ thẻ [có thể nhẹ] gần đây nhất trong lịch sử của chi nhánh này .
      • Do đó, thẻ được tham chiếu bởi git describecó thể KHÔNG phản ánh tổng thể thẻ được tạo gần đây nhất .

Vì vậy, đối với một thẻ đã cho (ví dụ: v0.1.0), để biết nguồn thực tế nào trong một bản dựng thực tế (của nguồn đó), bạn thực sự cần phải biết nhánh mà bản dựng được dựa trên, phải không? Tức là, một cam kết nhất định có thể có con cháu khác nhau trong các ngành khác nhau, phải không?
Hawkeye Parker

2
@HawkeyeParker: Tôi không đắm chìm trong vấn đề này nữa, nhưng bạn không cần phải biết chi nhánh, vì thẻ xác định một cam kết cụ thể (có thể là một phần của nhiều chi nhánh) và bạn có thể điều tra từ đó.
mkuity0

Nhưng nếu tôi thực hiện git show [tagname] thì nó hiển thị tên chi nhánh ở trên Author và Date, điều này mâu thuẫn với "chạy git show <tag> để xem chi tiết của thẻ không chứa tham chiếu đến bất kỳ chi nhánh nào"
Brad Thomas

39

Thẻ và chi nhánh hoàn toàn không liên quan, vì các thẻ đề cập đến một cam kết cụ thể và chi nhánh là một tham chiếu di chuyển đến cam kết cuối cùng của lịch sử. Chi nhánh đi, thẻ ở lại.

Vì vậy, khi bạn gắn thẻ một cam kết, git không quan tâm đến cam kết hoặc chi nhánh nào được kiểm tra, nếu bạn cung cấp cho anh ta SHA1 về những gì bạn muốn gắn thẻ.

Tôi thậm chí có thể gắn thẻ bằng cách tham chiếu đến một nhánh (sau đó nó sẽ gắn thẻ đầu của nhánh) và sau đó nói rằng đầu của nhánh đó ở nơi khác ( git reset --hardví dụ) hoặc xóa chi nhánh. Thẻ tôi đã tạo tuy nhiên sẽ không di chuyển.


17
Nói cách khác, các thẻ chỉ là tên đẹp cho băm git xấu xí. Thẻ (và hàm băm) tồn tại bất kể nhánh nào tồn tại (ed).
C-Otto

8

Khi gọi chỉ git tag <TAGNAME> mà không có bất kỳ tham số bổ sung nào, Git sẽ tạo một thẻ mới từ CHÍNH hiện tại của bạn (tức là CHÍNH của chi nhánh hiện tại của bạn). Khi thêm các xác nhận bổ sung vào nhánh này, chi nhánh CHÍNH sẽ theo kịp các cam kết mới đó, trong khi thẻ luôn đề cập đến cùng một cam kết.

Khi gọi, git tag <TAGNAME> <COMMIT>bạn thậm chí có thể chỉ định cam kết nào sẽ được sử dụng để tạo thẻ.

Bất kể, thẻ vẫn chỉ đơn giản là một "con trỏ" đến một cam kết nhất định (không phải là một nhánh).


6

Chúng tôi có thể tạo một thẻ cho một số cam kết trong quá khứ:

git tag [tag_name] [reference_of_commit]

ví dụ:

git tag v1.0 5fcdb03

1

Nếu bạn muốn gắn thẻ chi nhánh bạn đang ở, hãy gõ:

git tag <tag>

và đẩy chi nhánh với:

git push origin --tags

0

Nếu bạn muốn tạo một thẻ từ một nhánh giống như vậy release/yourbranchthì bạn nên sử dụng một cái gì đó như

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Sau khi tạo thẻ thích hợp nếu bạn muốn đẩy thẻ vào điều khiển từ xa thì hãy sử dụng lệnh

git push origin YOUR_TAG_VERSION_OR_NAME
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.