Git phân nhánh và gắn thẻ thực hành tốt nhất


141

Tôi hiện đang học cách sử dụng Git bằng cách đọc Pro Git . Ngay bây giờ tôi đang tìm hiểu về phân nhánh và thẻ. Câu hỏi của tôi là khi nào tôi nên sử dụng một chi nhánh và khi nào tôi nên sử dụng một thẻ?

Ví dụ: giả sử tôi tạo một nhánh cho phiên bản 1.1 của dự án. Khi tôi hoàn thành và phát hành phiên bản này, tôi có nên rời khỏi chi nhánh để đánh dấu phiên bản phát hành không? Hoặc tôi nên thêm một thẻ? Nếu tôi thêm một thẻ, tôi có nên xóa nhánh phiên bản (giả sử rằng nó được hợp nhất thành chủ hoặc một số nhánh khác) không?

Câu trả lời:


162

Tóm lại: Thực tiễn tốt nhất là phân nhánh, hợp nhất thường xuyên và luôn luôn đồng bộ .

Có những quy ước khá rõ ràng về việc giữ mã của bạn trong một nhánh riêng biệt từ nhánh chính:

  1. Bạn sắp thực hiện một thay đổi lớn hoặc đột phá
  2. Bạn sắp thực hiện một số thay đổi có thể không được sử dụng
  3. Bạn muốn thử nghiệm một cái gì đó mà bạn không chắc chắn nó sẽ hoạt động
  4. Khi bạn được yêu cầu phân nhánh, những người khác có thể cần làm gì đó trong chủ

Nguyên tắc chung là sau khi phân nhánh, bạn nên giữ đồng bộ với nhánh chính. Bởi vì cuối cùng bạn cần hợp nhất nó trở lại thành chủ. Để tránh một mớ hỗn độn phức tạp lớn khi hợp nhất trở lại, bạn nên cam kết thường xuyên, hợp nhất thường xuyên.

Thực hành tốt để làm theo

Một mô hình phân nhánh Git thành công của Vincent Driessen có những gợi ý tốt. Nếu mô hình phân nhánh này hấp dẫn bạn, hãy xem xét phần mở rộng dòng chảy thành git . Những người khác đã bình luận về dòng chảy .

Thực hành gắn thẻ

Như bạn đã biết, Git cung cấp cho bạn các định danh cam kết như 1.0-2-g1ab3183 nhưng đó không phải là thẻ! Việc gắn thẻ được thực hiện với thẻ git và các thẻ được tạo bằng thẻ git là cơ sở cho các định danh cam kết mà git mô tả tạo ra. Nói cách khác, trong Git bạn không gắn thẻ chi nhánh. Bạn đang gắn thẻ cam kết. Thật đúng khi nói rằng thẻ chỉ là một con trỏ chú thích đến một cam kết.

Hãy xem xét ví dụ thực tế đã chứng minh điều đó,

                        / - [v1.0]
                       v
---. ---. --- .--- S ---.--- Một <- chủ
                         \ 
                           \ -.--- B <- kiểm tra

Hãy cam kết 'S' được cam kết chỉ bằng thẻ 'v1.0'. Cam kết này là cả trên nhánh 'chính' và trên nhánh 'thử nghiệm'. Nếu bạn chạy " mô tả git " trên đầu trang của cam kết 'A' (đầu nhánh 'chủ'), bạn sẽ nhận được một cái gì đó như thế v1.0-2-g9c116e9. Nếu bạn chạy "mô tả git" trên đầu trang của cam kết 'A' (còn gọi là nhánh 'thử nghiệm'), bạn sẽ nhận được một cái gì đó giống như v1.0-2-g3f55e41, đó là trường hợp với cấu hình mô tả git mặc định. Lưu ý rằng kết quả này là hơi khác nhau. v1.0-2-g9c116e9có nghĩa là chúng tôi cam kết với id SHA-1 đã được sắp xếp 9c116e9, 2 lần xác nhận sau thẻ v1.0. Không có thẻ v1.0-2!

Nếu bạn muốn thẻ của mình chỉ xuất hiện trên nhánh 'chính', bạn có thể tạo cam kết mới (ví dụ: chỉ cập nhật thông tin phiên bản mặc định / dự phòng trong GIT-VERSION-FILE) sau điểm phân nhánh của nhánh 'thử nghiệm'. Nếu bạn gắn thẻ cam kết trên nhánh 'test' với ví dụ 'v1.0.3` thì nó chỉ hiển thị từ' test '.

Người giới thiệu

Tôi đã tìm thấy nhiều, rất nhiều, các blog và bài viết hữu ích để học hỏi. Tuy nhiên, những cái được minh họa chuyên nghiệp là những cái hiếm. Vì vậy, tôi muốn giới thiệu một bài đăng - Một mô hình phân nhánh Git thành công của @nvie. Tôi đã mượn hình minh họa của anh ấy :)

nhập mô tả hình ảnh ở đây


4
1.0-2-g1ab3183 là một định danh được xây dựng bởi git mô tả từ thông tin có sẵn từ git, nhưng gọi nó là định danh git thì hơi quá. Git xác định bằng hàm băm SHA; thẻ và các nhánh là cấu trúc của con người mà git theo dõi một cách hữu ích. Như vậy, tạo một thẻ khi bạn nghĩ rằng một ngày nào đó con người sẽ muốn tìm một dấu trang thuận tiện để cam kết.
mabraham

2
một minh họa tuyệt vời về tính đa chiều trong vũ trụ git. đẹp. cảm ơn
Tope

Điều đáng chú ý là nhiều dự án không có nhu cầu đối với một số làn đường được hiển thị trong sơ đồ này. Một số dự án chỉ cần những gì được gọi là phát triển và tính năng ở đây. Điều này thường đúng với các ứng dụng web có thể được triển khai theo ý muốn.
usr

37

Một nhánh được sử dụng nếu bạn có 2 phiên bản khác nhau của kho lưu trữ cùng một lúc. Thẻ là một cách để đánh dấu một điểm trong thời gian trong kho lưu trữ của bạn.

Bạn nên thêm một thẻ để đánh dấu một phiên bản phát hành. Nếu sau đó bạn cần sửa lỗi cho bản phát hành đó, bạn sẽ tạo một nhánh tại thẻ.

Bạn chỉ muốn xóa các nhánh đã được hợp nhất trở lại vào ĐẦU [hoặc một số nhánh khác].


3
oh ... và tôi giả sử bạn có nghĩa là chi nhánh được sáp nhập vào một chi nhánh khác, chẳng hạn như chủ. ĐẦU di chuyển mỗi khi tôi kiểm tra, phải không?
Code-Guru

Đầu thường chỉ vào một nhánh (trừ khi bạn ở chế độ ĐẦU tách rời), do đó, ĐẦU di chuyển với nhánh mà nó trỏ tới
LoicAG
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.