Trong git, có phải là một ý tưởng tồi để tạo một thẻ có cùng tên với một nhánh bị xóa?


20

Tôi có một dự án với mô hình phân nhánh git gần giống với mô hình git-Flow của nvie .

Các nhánh phát hành của chúng tôi được đặt tên theo định dạng SemVer , ví dụ:v1.5.2

Khi một nhánh phát hành được bật đèn xanh cho sản xuất, chúng tôi đóng chi nhánh, bằng cách hợp nhất nó thành chủ, áp dụng thẻ và sau đó xóa chi nhánh.

Khi chúng tôi xóa ngay chi nhánh phát hành, chúng tôi đã sử dụng cùng một mã định danh để gắn thẻ cho chi nhánh, ví dụ: v1.5.2

Đây là các lệnh chúng tôi sẽ sử dụng để đóng một nhánh phát hành:

$ git checkout master
$ git merge v1.5.2
$ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc"
$ git branch -d v1.5.2
$ git branch -dr origin/v1.5.2
$ git push origin :v1.5.2
$ git push
$ git push --tags

Điều này dường như hoạt động trong phần lớn các trường hợp, tuy nhiên nó gây ra một vấn đề trong kịch bản trong đó một phiên bản khác của git repo (ví dụ: một máy dev khác, hoặc môi trường dàn dựng) có kiểm tra cục bộ của nhánh v1.5.2.

Các git push origin :v1.5.2lệnh sẽ xóa các chi nhánh ở xa, nhưng không xóa phiên bản cục bộ của chi nhánh (nếu nó tồn tại) trong tất cả các hợp đồng mua lại.

Điều này dẫn đến một tham chiếu mơ hồ, khi thử thanh toán v1.5.2trong các repos đó:

$ git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.

Điều này có thể tránh được mà không sử dụng một cú pháp khác nhau cho các nhánh, ví dụ release-v1.5.2, hoặc v1.5.2-rc?

Hoặc là không thể tránh khỏi, và do đó, một ý tưởng tồi tệ về cơ bản để tạo ra một thẻ có cùng tên với một nhánh bị xóa?

Câu trả lời:


19

Nếu bạn hoàn toàn muốn giữ sơ đồ đặt tên này, bạn có thể:

Quyết định rằng bạn không quan tâm đến những cảnh báo này

Đó là, nếu bạn hài lòng với thực tế rằng:

  • git checkout <ref>sẽ kiểm tra refs/heads/<ref>lại refs/tags/<ref>(xem git-checkout )
  • các lệnh khác sẽ sử dụng refs/tags/<ref>hơn refs/heads/<ref>(xem gitrevutions )

Ví dụ: trong kho lưu trữ kiểm tra này, v1.5.2nhánh chỉ ra cam kết B, nhưng v1.5.2thẻ chỉ ra cam kết A.

% git log --oneline --decorate
8060f6f (HEAD, v1.5.2, master) commit B
0e69483 (tag: v1.5.2) commit A

git checkout thích tên chi nhánh:

% git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.
Switched to branch 'v1.5.2'
% git log --decorate --oneline -1
8060f6f (HEAD, v1.5.2, master) commit B

nhưng git logsẽ sử dụng tên thẻ:

% git log --decorate --oneline -1 v1.5.2
warning: refname 'v1.5.2' is ambiguous.
0e69483 (tag: v1.5.2) commit A

Điều này có thể gây nhầm lẫn.

Huấn luyện mọi người xóa các chi nhánh địa phương khi họ thấy một thẻ mới

Điều này có thể khó / lúng túng tùy thuộc vào quy mô tổ chức của bạn.

Viết một trình bao bọc xung quanh "git pull" và "git fetch"

Đó là, viết một trình bao bọc để kiểm tra nếu có bất kỳ thẻ nào phủ bóng tên nhánh và cảnh báo về (hoặc xóa) các nhánh đó. Điều này nghe có vẻ đau đớn và nó có thể là không mong muốn nếu chi nhánh bị che khuất hiện đang được kiểm tra.

Thật không may, có vẻ như cách dễ nhất để giải quyết vấn đề này có thể là thay đổi cách bạn đặt tên cho các chi nhánh của mình. Liên kết bạn đã đăng sử dụng các lược đồ đặt tên khác nhau cho các thẻ và chi nhánh: nếu bạn chủ yếu theo phương pháp đó, áp dụng sơ đồ đặt tên của nó có thể là giải pháp dễ nhất.


Cảm ơn vì sự trả lời. Rất hữu ích. Viên đạn đầu tiên của bạn git checkoutsẽ kiểm tra thẻ trên chi nhánh khi có một tài liệu tham khảo tuyệt vời, tuy nhiên đây không phải là hành vi tôi đang thấy, ref: gist.github.com/tommarshall/9376724 . Đây có phải là một cái gì đó đã thay đổi trong một phiên bản git hiện đại hơn? Có một lá cờ nào tôi có thể đặt gitconfigđể có được hành vi này không?
tommarshall

Bạn nói đúng, tôi đã hoàn toàn sai. Lấy làm tiếc! Tôi đã sửa câu trả lời của mình và thêm một ví dụ.
benj

10

Bạn có thể chỉ định rõ ràng liệu bạn muốn một chi nhánh hoặc một thẻ bằng cách sử dụng tên đầy đủ:

 git checkout refs/heads/v1.5.2

hoặc là

git checkout refs/tags/v1.5.2
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.