Khi nào là thời điểm thích hợp để xóa một nhánh tính năng git?


88

Tôi không muốn kết thúc với 82 nhánh tính năng quanh quẩn , vì vậy tôi đang tự hỏi những hạn chế tiềm ẩn là gì khi chỉ cần xóa nhánh tính năng ngay sau khi tôi hợp nhất nó để làm chủ.

Quy trình làm việc:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

Có vấn đề gì ở đây không?


1
Tôi sẽ nói không có vấn đề gì vì nếu bạn thực sự cần chúng, bạn luôn có thể phục hồi nhánh đã xóa sau đó.
slbetman

@slebetman Theo như tôi biết thì một nhánh đã bị xóa không thể phục hồi. Tuy nhiên, nếu nhánh đã được sáp nhập hoàn toàn vào tổng thể trước khi xóa nó, thì không cần nhánh nào nữa.
Simeon

1
@Simeon Có bạn có thể. Git không bao giờ xóa các cam kết nên khi bạn xóa chi nhánh của mình, bạn chỉ xóa tên của nó. Để phục hồi một nhánh đã xóa, bạn chỉ cần nhớ điều cuối cùng bạn đã cam kết với nhánh đó và bạn có thể tìm kiếm git reflognó. Sau đó, kiểm tra hash
slbetman

@slebetman sẽ chỉ đúng nếu chi nhánh cuối cùng đã được hợp nhất. nếu các cam kết bị bỏ lại, cuối cùng chúng sẽ không thể truy cập được và sẽ bị thu gom rác sau một khoảng thời gian nhất định. thậm chí các mục trong bản cập nhật cuối cùng sẽ bị xóa, bạn có khoảng 90 ngày theo mặc định.
goldratio

@goldenratio: Bất kỳ tài liệu tham khảo cho điều đó?
slbetman

Câu trả lời:


61

Xóa sau khi hợp nhất là cách thông thường. Đây là lý do tại sao git branch -d yourbranchnamephải kiểm tra để đảm bảo rằng nhánh được hợp nhất hoàn toàn trước khi nó xóa.

Có một vài lý do mà tôi có thể nghĩ ra để duy trì một chi nhánh: bạn có thể muốn giữ nó trong trường hợp bạn có lỗi quay lại sau khi nó được sản xuất hoặc bạn có thể muốn có một kỷ lục lịch sử.

Trong cả hai trường hợp, bạn có tùy chọn gắn thẻ người đứng đầu chi nhánh trước khi xóa nó. Thẻ giống như một nhánh ở chỗ nó là một con trỏ đến một cam kết, ngoại trừ một số khác biệt nhỏ: 1) sứ thường không hiển thị thẻ trong các lệnh khám phá như git show-branch hoặc tab-auto complete khi thanh toán, 2) việc kiểm tra một cái sẽ đưa bạn vào HEAD 3) tách rời (không phải tham chiếu), bạn có thể để lại " thông báo gắn thẻ ", khiến thẻ được lưu dưới dạng một đối tượng trong kho lưu trữ đối tượng giống như một cam kết.

Bằng cách này, bạn bảo toàn lịch sử và nếu bạn cần sửa lỗi, tôi khuyên bạn chỉ nên tạo một nhánh mới ngoài tổng thể để khắc phục.


1
Việc kiểm tra thẻ ra sẽ đặt HEAD, nhưng không tự động tạo nhánh. HEAD trên một cam kết không có chi nhánh là điều khiến nó bị tách rời.
Binarian

1
Bạn nói đúng, nó đặt HEAD thành id cam kết thay vì tham chiếu. Phần OP của tôi không chính xác. Tôi nên cập nhật nó.
thợ nề

96

Tôi xóa sau khi hợp nhất, nhưng tôi luôn thực hiện a git merge --no-ff, để tránh chuyển tiếp nhanh để lịch sử chi nhánh hiển thị trên biểu đồ. Tôi muốn có lịch sử về nơi nhánh tính năng khởi hành từ nhánh phát triển và nơi nó kết hợp trở lại:

Hợp nhất có hoặc không có tua nhanh

Điều này được lấy từ Mô hình phân nhánh Git thành công của Vincent Driessen, một quy trình làm việc rất hay để sử dụng với git mà tôi áp dụng cho hầu hết các dự án của mình.


Đây là một cách hay khác để lưu giữ lịch sử, vì bạn có thể chọn các cam kết có thể truy cập được từ đối tượng địa lý nhưng không phải từ trang chủ: rev ^ 1..rev ^ 2. Mặt trái của nó là nó bắt vít bất kỳ khôi phục nào mà bạn có thể muốn thực hiện từ nhánh chính của mình (ví dụ: nếu bạn muốn giữ chế độ chính được khôi phục trên điều khiển từ xa ngược dòng, điều này rất phổ biến).
thợ nề

1
Tôi không có vấn đề đó. Nhóm của chúng tôi đồng bộ hóa thông qua github và tôi thường không cần phải rebase, nhưng tôi không nghĩ đó là một nhược điểm ở đây. Ngay cả khi bạn căn cứ lại nhánh tính năng và phát triển của mình, phân nhánh vẫn hiển thị trên biểu đồ và điều quan trọng là những gì trong nhánh tính năng liên quan đến sự phát triển, chứ không phải cam kết mà bạn đã khởi hành ban đầu khi tạo nhánh đó.
lkraider

@Ikraider, cảm ơn vì đã nhắc nhở. Tôi đã xem bài báo đó khi tôi mới học git, nó có ý nghĩa hơn đối với tôi bây giờ. Tôi căn cứ lại các nhánh tính năng của mình, nhưng tôi merge --no-fftrở lại thành thạo vì như bạn nói bạn có thể xem lịch sử.
bstpierre

7

Tôi có thể nghĩ đến hai lý do tại sao bạn có thể muốn giữ lại một nhánh tính năng một chút:

  • Có khả năng nó sẽ quay trở lại với bạn để làm việc nhiều hơn bằng cách ngược dòng.
  • Các nhà phát triển khác có thể muốn tính năng đó mà không muốn mọi thứ khác trong tổng thể.

Trong thực tế, hầu hết thời gian xóa sau khi hợp nhất là tốt.


6

Quy trình công việc điển hình sẽ là

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

tôi nghĩ đó là quy trình làm việc điển hình (xóa sau khi hợp nhất)

CHỈNH SỬA Vì vậy, thay vì hợp nhất, ít nhất là đối với các nhánh tồn tại trong thời gian ngắn, tôi nghĩ ý tưởng là để căn cứ lại chúng cho tổng thể. thì bạn sẽ có lịch sử thay đổi tuyến tính và toàn bộ nhánh trở thành một phần của thân chính. trong trường hợp này, bạn có tất cả các thay đổi ở đó nên rõ ràng bạn không cần bản sao.


Vì vậy, thực sự không có ích gì khi giữ các nhánh xung quanh, phải không?
bstpierre

1
Tôi thực sự khuyên bạn nên tránh "rebase". Rebasing nói chung là có hại, chỉ hữu ích trong một số trường hợp.
Dietrich Epp

9
Rebasing là một quy trình làm việc hoàn toàn hợp lý cho các chi nhánh tư nhân, địa phương của bạn. Ví dụ, việc duy trì đồng bộ với công việc ngược dòng bằng cách khôi phục ("phục hồi xuống "). Việc rebase up * ít phổ biến hơn và thường có hại. câu trả lời thứ hai không thực sự có ý nghĩa, bởi vì cho dù bạn đang phục hồi hoặc hợp nhất trong những thay đổi ngược dòng, bạn vẫn phải đẩy những thứ đó "lên" bằng cách nào đó. Ngay cả trên chi nhánh địa phương của bạn, bạn sẽ phải hợp nhất tính năng của mình để thành thạo tại một số điểm. Ưu điểm của việc tiếp tục dựa trên các tính năng của bạn là việc hợp nhất này trở nên nhanh chóng.
thợ nề

1
Tuy nhiên, có điều gì đó cần chú ý với các chi nhánh đang phục hồi, điều này đã làm tôi đau đầu. Rõ ràng là bây giờ, nhưng tôi đã đi nhiều tháng trên một nhánh trường tồn, luôn luôn chống lại chủ nhân toàn bộ điều. Nó đã kết thúc khoảng 600 cam kết chi tiết, tốt đẹp, nhưng chủ nhân đã được cấu trúc lại một cách điên cuồng và hoàn toàn thay đổi nhiều lần. Bằng cách phục hồi toàn bộ chi nhánh mỗi lần, tôi đã cắt các cam kết cũ của nó khỏi kết nối của họ để cam kết chủ có ý nghĩa đối với họ. Bây giờ tôi thích hợp nhất trong tổng thể khi cần thiết. Tôi sẽ chỉ rebase nếu lịch sử của nhánh hoàn toàn không bị ảnh hưởng.
Gary Fixler
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.