Tại sao Git có thẻ?


8

Tôi đã đọc phân nhánh Git và gắn thẻ các thực tiễn tốt nhấtnhận xét gắn thẻ git - thực tiễn tốt nhất , nhưng tôi không thấy câu trả lời trực tiếp cho điều gì đó mà tôi đã tự hỏi trong một thời gian dài:

Tại sao Git có thẻ? (thay vì chỉ các chi nhánh)

Họ dường như là công dân hạng hai, hoặc ít nhất là "khác biệt". Họ không bị đẩy trừ khi bạn chỉ định rõ ràng. Xóa các thẻ từ xa không gây ra xóa trong repos xuôi dòng.

Điểm cuối cùng này là một vấn đề gần đây, khi ai đó đã đẩy một loạt các thẻ rác với hàng tấn cam kết từ một repo khác. Chúng tôi có thể xóa chúng ngược dòng và gc các cam kết, nhưng điều đó sẽ không phù hợp, và lần tới khi ai đó đẩy một thẻ với git push --tags, họ sẽ sửa lại các thẻ rác và cam kết. Vì vậy, chúng tôi phải đảm bảo mọi người đã xóa chúng.

Khi nào và tại sao tôi sẽ sử dụng thẻ thay vì chi nhánh?


1
Đối với một điều, các thẻ có thể được chú thích, các nhánh không thể. Các thẻ nói chung là những thứ "vĩnh viễn" (thường để đánh dấu các phiên bản cụ thể của dự án).
Rufflewind

Câu trả lời:


10

Điều này được thực hiện trên mục đích .

Họ dường như là công dân hạng hai, hoặc ít nhất là "khác biệt". Họ không bị đẩy trừ khi bạn chỉ định rõ ràng. Xóa các thẻ từ xa không gây ra xóa trong repos xuôi dòng.

Tôi không đồng ý với câu trả lời của lxrec về việc git có mặc định xấu. Nếu bạn theo dõi danh sách gửi thư, bạn có thể thấy rằng các nhà phát triển git thực sự quan tâm đến việc có các mặc định hợp lý. Nó sẽ có ý nghĩa để có --ff-onlymột mặc định? Tôi không nghĩ vậy.

Thẻ làm cho nó có thể có chú thích cho bản sao phát triển địa phương của riêng bạn. Tôi không muốn nhìn thấy tôi why_does_it_break_heretodo_fix_formattingthẻ bị đẩy mà không cần sự đồng ý của tôi (những người không phải là tên thẻ thực tế). Mặt khác, gắn thẻ một bản phát hành là một cái gì đó ít xảy ra hơn và thật hợp lý khi yêu cầu một cú đẩy rõ ràng (hoặc sử dụng bí danh).

Tôi không thấy sự khác biệt lớn giữa các thẻ và các nhánh ghi lại cách đẩy / tìm nạp hoạt động. Trong ví dụ của bạn, nếu các thẻ rác là các nhánh, việc xóa sẽ lan truyền như bạn dự định?

Khi nào và tại sao tôi sẽ sử dụng thẻ thay vì chi nhánh?

Nói chung:

  • các nhánh dành cho cây: chúng chỉ đến các cam kết khác nhau theo thời gian
  • các thẻ dành cho các cam kết riêng lẻ và không thay đổi (điều này bao gồm các cây đóng băng như phát hành)

Các thẻ không được chú thích và các thẻ chú thích đã ký (nghĩa là các thẻ mà người ta thực sự sẽ sử dụng, giả sử, gắn thẻ một bản phát hành công khai) được đẩy theo mặc định? Đó chỉ là các thẻ "cục bộ" không được chú thích mà không được đẩy theo mặc định, bởi vì, như bạn đã nói, chúng là cục bộ .
Jörg W Mittag

@ JörgWMittag Tôi đã không kiểm tra, nhưng tôi tin tưởng bạn về điều này. Đợi một chút, điều đó có nghĩa là, git đó có mặc định hợp lý?!
coredump

@ JörgWMittag Vì vậy, tôi đã thử cục bộ với hai kho lưu trữ trong các thư mục khác nhau và không chú thích thẻ cũng không chú thích + thẻ đã ký khi đẩy. Đây là với git 1.8.2.
coredump

À, đợi đã. Tôi nghĩ rằng nó được chú thích và các thẻ đã ký được tự động đẩy git push --tags, nhưng các thẻ cục bộ thì không. Đã được một thời gian kể từ khi tôi sử dụng git trong sự tức giận, đó là cách trước Git 1.0.
Jörg W Mittag

1

1) Tại sao thẻ git là công dân hạng hai?

Bởi vì thật đáng buồn, git có rất nhiều mặc định xấu. Nhiều như tôi thích, nó đơn giản không phải là một công cụ trực quan hay thân thiện với người mới. Khá nhiều người phải thiết lập cấu hình git hoặc bí danh hoặc tập lệnh sử dụng hàng tá tùy chọn - như (chỉ - chỉ) để khiến git bắt đầu hành xử theo cách họ thực sự muốn. Thẻ chỉ là một ví dụ nữa.

2) Tại sao tôi nên sử dụng thẻ git thay vì chi nhánh?

Một nhánh được dự định để đánh dấu một cam kết mà bạn thực hiện các cam kết khác trên đầu trang. Khi bạn thực hiện một cam kết mới với chi nhánh đó, chính chi nhánh đó sẽ "di chuyển" để nó trỏ đến cam kết mới.

Mặt khác, một thẻ đánh dấu một cam kết, và sau đó tiếp tục đánh dấu cùng một cam kết đó (theo lý thuyết). Cách sử dụng phổ biến nhất là gắn thẻ cam kết với các phiên bản phát hành chính thức của họ mỗi khi bạn tung ra một phiên bản mới để sản xuất.

Chúng tôi sử dụng cả hai nhánh và thẻ cho các phiên bản phát hành của chúng tôi. Chi nhánh chỉ đại diện cho phiên bản chính / phụ, trong khi các thẻ chỉ định các bản phát hành bản vá / bản dựng trong phiên bản chính / phụ đó. Vì vậy, nếu chúng ta cần áp dụng sửa lỗi cho phiên bản cũ, chúng ta chỉ cần chọn cam kết lỗi từ chủ vào nhánh thích hợp, sau đó gắn thẻ cam kết mới với số phiên bản mới có trong quá trình triển khai.

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.