2011-01-13 7 views
6

Tôi có câu hỏi về luồng công việc liên quan đến Mercurial (có thể áp dụng cho DVCS khác).kiểm soát phiên bản: di chuyển sửa lỗi/tăng cường mã xung quanh tính năng phát triển

Repo được thiết lập bằng cách sử dụng thiết lập mặc định/ổn định điển hình.

Bạn được giao nhiệm vụ xây dựng một tính năng mới và hy vọng sẽ mất một khoảng thời gian (tháng +). Trong khi làm việc trên tính năng này, bạn gặp phải một lỗi mà bạn cho rằng cần được khắc phục và áp dụng cho sản xuất sớm hơn sau này. Hoặc có lẽ, bạn nhận thấy một số mã có thể được tài liệu tốt hơn.

Giả định của tôi là bạn thực hiện sửa chữa mặc định và sau đó chuyển sang ổn định và thực hiện sửa chữa lại (bằng tay hoặc bằng cách áp dụng bản vá). Đó có phải là chính xác hoặc bạn nên ngay lập tức chuyển sang ổn định, làm thay đổi đó và sau đó hợp nhất ổn định vào mặc định?

Sử dụng miếng vá có vẻ hợp lý hơn đối với tôi. Bạn có thể thực hiện một cam kết cụ thể cho việc sửa lỗi và áp dụng bản vá đó một cách thuận tiện. Ý tôi là nếu lỗi không quá khó chịu, bạn không cần khẩn trương và phá vỡ dòng chảy của mình. Đúng?

Vì vậy, bạn xử lý tình huống này như thế nào?

Cảm ơn

+0

Lưu ý: Wim đề xuất phương án thay thế khả thi cho việc hái hoa anh đào mà bạn có thể cân nhắc. – VonC

Trả lời

6

Bạn có thể quay về điểm chi nhánh (sửa đổi B), sửa chữa các lỗi đó (sửa đổi X) và sau đó hợp nhất việc sửa chữa vào cả hai chi nhánh (M1M2):

-----B--o----o---M1----o---> stable 
    |  /
    |---------X bugfix 
    |   \ 
    \--o---o----M2----o-----> feature 

Bằng cách này bạn có thể được sửa chữa của bạn trong mỗi chi nhánh với hoạt động bình thường hg merge; không cần vá, cấy hoặc MQ'ing.

Thực hiện cùng một ý tưởng thêm một bước nữa: bạn có thể quay lại bản sửa đổi đã giới thiệu lỗi ở địa điểm đầu tiên. Bằng cách sử dụng điều này làm cơ sở để sửa chữa, bạn sẽ chắc chắn rằng bạn có thể hợp nhất sửa chữa của bạn vào bất kỳ chi nhánh có chứa lỗi.

+2

Huzzah, cho người hiểu "nơi" bạn thực hiện thay đổi cũng quan trọng như thay đổi chính nó. –

+0

+1 để tránh ghi lại lịch sử bất kỳ. – VonC

+0

Tôi có thể hiểu tại sao người ta không muốn lặp lại lịch sử, nhưng đối với các bản sửa lỗi đơn giản, "cấy ghép" có vẻ là phương pháp dễ nhất, đồng thời giữ dòng thời gian đẹp và tuyến tính, nơi hợp nhất có thể làm phức tạp dòng thời gian. Tôi chỉ lười à? – jbarreiros

0

Một khi bạn đã thực hiện sửa chữa nhỏ của bạn cam kết, bạn có thể sử dụng Hg Transplant Extension và báo cáo rằng cùng sửa chữa trên một chi nhánh khác.

Nếu điều này không phù hợp, các khả năng chọn cherry khác được nêu chi tiết trong câu hỏi SO "Mercurial cherry picking changes for commit".

+0

Cảm ơn bạn VonC, phần mở rộng cấy ghép sẽ làm rất tốt. Cảm ơn các liên kết quá. – jbarreiros

+1

Người ta có thể tránh điều này bằng quy trình làm việc tốt hơn. Giải pháp của Wim dưới đây là thích hợp hơn vì bạn không kết thúc với cùng một thay đổi hai lần trong repo của bạn với các hash-id khác nhau. Thực hiện thay đổi tương tự ở hai nơi làm cho việc hợp nhất các địa điểm đó ít tự động hơn. –

+0

@ Ry4an: Tôi đồng ý. Tuy nhiên, một lần nữa, tôi lý do quá nhiều như một người sử dụng Git;) – VonC