Tại sao tôi nên sử dụng thẻ so với các nhánh phát hành / beta để lập phiên bản?


114

Tôi đã sử dụng git được khoảng một năm và muốn sử dụng tính năng gắn thẻ để gắn thẻ cam kết ở các phiên bản khác nhau. Tôi đã tìm thấy rất nhiều thông tin về các lệnh để sử dụng để làm việc với các thẻ, nhưng điều tôi muốn biết là tại sao lại sử dụng tính năng gắn thẻ nếu tôi có thể tạo một nhánh mới được gọi 1.1.0và không phải làm rối trí toàn bộ. bộ lệnh git mới?

Có rất nhiều lý do chính đáng để gắn thẻ hơn là phân nhánh nhưng tôi muốn biết những lợi thế đó là gì.

Câu trả lời:


96

Các thẻ chủ yếu được sử dụng để tham chiếu trong tương lai đến phiên bản cụ thể của dự án, bằng cách gắn thẻ cam kết. Tất nhiên, bạn luôn có thể sử dụng các nhánh, nhưng nếu bạn thay đổi phiên bản nhiều, bạn sẽ có rất nhiều nhánh không sử dụng hoặc hiếm khi được sử dụng.

Thực tế, các thẻ dù sao cũng là các nhánh không có nhánh, chỉ thêm một cách để tham chiếu đến một phiên bản cụ thể của dự án để giảm độ phức tạp.

Chỉnh sửa: Đây là một cách hay để sử dụng git mà tôi sử dụng cho tất cả các dự án của mình.


Heh (: Nó thực sự là một công việc tuyệt vời mà bao gồm tất cả các giải pháp khả thi.
Hakan Deryal

vâng, tôi đã thấy phương pháp nvie trước đây và đã khá bối rối với nó. Tuy nhiên, tôi khao khát thực hiện nó một khi tôi hiểu nó. Tôi đoán với một thẻ, bạn không thể vô tình thay đổi mã, cam kết và vẫn ở cùng một phiên bản. Với cành cây, điều đó có thể vô tình xảy ra. Thẻ dường như là một cách an toàn hơn để đánh dấu các bản phát hành.
wufoo

2
Cái hay của phương pháp nvie đối với tôi là tôi không cần phải hiểu nó ban đầu. Tôi chỉ có thể tìm phần cho những gì tôi muốn làm và gõ các lệnh. Sau một vài lần, nó trở nên tự nhiên và trong vài ngày, tôi đã nhảy múa xung quanh các cành cây như một người chuyên nghiệp!
Killroy

Hy vọng hiểu được cách tiếp cận gitflow bằng cách áp dụng nó một cách mù quáng sẽ khiến bạn bỏ lỡ tất cả các đơn giản hóa mà bạn có thể áp dụng cho tình huống của mình. Và gitflow thực sự không phù hợp với hầu hết các nhóm: quá phức tạp hoặc quá đơn giản.
toolforger

151

Một thẻ là bất biến .

Trong khi bạn có thể tạo một nhánh có tên là "1.0.0" - bạn hoặc bất kỳ ai có quyền cam kết, sau đó cũng có thể chỉ cần đẩy đến nhánh đó (có chủ ý hoặc không) và thay đổi ý nghĩa của 1.0.0.

Bạn không thể làm điều đó với một thẻ, một khi bạn tạo một thẻ - vậy là xong; Thẻ 1.0.0 có nghĩa là chính xác và không thể thay đổi * .

Đó là sự khác biệt thực tế chính giữa thẻ và nhánh

* Bạn có thể xóa và tạo lại thẻ do đó thay đổi thẻ, nhưng chắc chắn không phải ngẫu nhiên.


18

Tôi có xu hướng sử dụng quy trình làm việc kết hợp cả thẻ nhánh. Thẻ rất tốt để đánh dấu mã đã phát hành hoặc các bản dựng phát triển đáng chú ý. Các nhánh rất tốt để theo dõi tất cả các thay đổi liên quan đến một phiên bản cụ thể.

Đây là một bản viết tốt về loại quy trình công việc này: http://nvie.com/posts/a-successful-git-branching-model/


18

Nhánh và thẻ giống nhau (con trỏ đến một cam kết, hay còn gọi là. "Ref" ), ngoại trừ nhánh tự động chuyển sang cam kết tiếp theo trong khi thẻ vẫn mãi mãi là 1 trên cùng một cam kết.

Khi tạo bản phát hành, bạn thường muốn đánh dấu "ảnh chụp nhanh" của mã mà từ đó bản phát hành đó được tạo và bạn muốn nó luôn được đánh dấu theo cách đó ngay cả khi bạn tiếp tục phát triển mã, vì vậy bạn sẽ sử dụng thẻ.

Nếu bạn đã thử sử dụng một nhánh cho điều đó, nó có thể vô tình chuyển sang một cam kết khác, từ đó bản phát hành không được xây dựng.


1 Tất nhiên trừ khi bạn xóa thẻ.

LƯU Ý: Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi cảm thấy rằng sự giống nhau (và một điểm khác biệt quan trọng) giữa các nhánh và thẻ đã không được thể hiện trong các câu trả lời khác rõ ràng như nó có thể.


Kính gửi @downvoter, bất kỳ lý do cụ thể nào cho việc downvote?
Branko Dimitrijevic

Tôi không tán thành câu trả lời của bạn nhưng ý bạn là "chi nhánh tự động chuyển sang cam kết tiếp theo"? Các nhánh không tự động chuyển đến bất kỳ cam kết nào. Đang chạy git commitcập nhật phần đầu của nhánh đã kiểm tra để tham chiếu đến cam kết mới, có, nhưng không có nhánh nào khác “tự động” chuyển sang cam kết tiếp theo. Bạn nên làm rõ đoạn đầu tiên của câu trả lời của bạn.
Bàn chải đánh răng

1
@Toothbrush Chắc chắn, ý tôi là "tự động di chuyển". Tuy nhiên, nhánh không thực sự "sở hữu" bất kỳ cam kết nào, thậm chí nó không trỏ đến một tập hợp các cam kết, nó chỉ trỏ đến một cam kết (và phần còn lại có thể được ngụ ý, đôi khi không chính xác, bằng cách xem biểu đồ cam kết). Dưới git, nhánh chỉ là một tệp một dòng bên dưới .git\refs\heads, chứa băm của cam kết. Bản thân họ không "nhớ" nhánh nào đã tạo ra chúng. Điều này khác với Mercurial, ví dụ, ở đó thông tin chi nhánh có thể được ghi vào siêu dữ liệu của cam kết.
Branko Dimitrijevic

Có, nhưng rất nhiều người không biết điều đó - đặc biệt là những người mới bắt đầu bối rối về vô số cách được đề xuất trực tuyến để thực hiện mọi việc với Git.
Bàn chải đánh răng

6

Bạn sử dụng thẻ để ghi chú các cam kết quan trọng trong lịch sử. "Đây là cam kết chính xác mà chúng tôi đã sử dụng cho phiên bản này vào ngày mưa thứ năm khi máy chủ bản dựng bị hỏng". Nếu bạn sử dụng một nhánh thay vì một thẻ, bạn không bao giờ có thể biết chính xác bạn đã sử dụng cam kết nào. Bạn chỉ biết "Chúng tôi đã phát hành phiên bản 1.1.0 ở đâu đó trên chi nhánh này", trừ khi bạn viết thủ công mã băm chính xác cho cam kết đó, đó là lý do tại sao bạn sử dụng thẻ ngay từ đầu :)


4
Tôi nghĩ ý của anh ấy là tạo một nhánh có tên 1.1.0 và không sử dụng nó nữa, vì vậy nó sẽ đại diện cho dự án trong phiên bản được đặt tên.
Hakan Deryal 21/03/12

2

Ngoài các câu trả lời khác, đây là 2 xu của tôi.

Câu trả lời ngắn gọn: Sử dụng thẻ cho các phiên bản phát hành

Câu trả lời dài: Tôi tin rằng việc sử dụng các thẻ để lập phiên bản phát hành cụ thể sẽ tốt hơn so với việc sử dụng các nhánh. Nếu bạn cần cập nhật relase, chỉ cần tách nhánh của cam kết được gắn thẻ và khi bạn hoàn thành công việc trên nhánh đó (rất có thể là nhánh hotfix), hãy tạo một thẻ mới ở đầu nhánh mới đó với phiên bản mới. Sau đó, hợp nhất nhánh đó lại thành master / development vì bạn thực sự không nên thay đổi phiên bản phát hành trừ khi đó là một hotfix có khả năng được hợp nhất lại vào mã nguồn của bạn. Sau đó xóa nhánh đó vì nó không còn cần thiết nữa. Nếu bạn cần áp dụng một hotfix khác cho phiên bản mới đó, hãy lặp lại các bước tương tự.

Tham khảo phần của bài viết sau hướng dẫn cách hợp nhất một hotfix với quy trình làm việc Git của tác giả - https://hackernoon.com/a-branching-and-releasing-strategy-that-fits-github-flow-be1b6c48eca2

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.