2012-01-25 45 views
6

Tôi có một dự án tôi quản lý từ một kho lưu trữ git. Chúng tôi sử dụng chiến lược phân nhánh progit (như được mô tả trong câu trả lời được chấp nhận, tại đây: Git branch strategy for small dev team) trong đó một chi nhánh là chi nhánh sản xuất và một chi nhánh khác là chi nhánh phát triển/thử nghiệm. Chúng tôi triển khai mã bằng vải.Nơi lưu trữ sự khác biệt giữa chi nhánh sản xuất và dev trong git?

Khi chúng tôi sẵn sàng tạo bản phát hành mới với git, chúng tôi hợp nhất chi nhánh phát triển/thử nghiệm vào chi nhánh sản xuất và sau đó triển khai chi nhánh sản xuất bằng vải. Vấn đề là có sự khác biệt về mã giữa phát triển và sản xuất - một số biểu tượng thay đổi, một số máy chủ/thông tin đăng nhập DB khác nhau, loại điều đó. Tôi đã giữ một tập tin .patch có chứa sự khác biệt và có vải áp dụng các bản vá khi nó triển khai môi trường sản xuất, nhưng điều này không hoạt động tốt. Đặc biệt, nó hoàn toàn thất bại nếu một số mã xung quanh bản vá đã thay đổi - bản vá không thể áp dụng và hủy triển khai của tôi.

Tôi đã tự hỏi liệu tôi có nên áp dụng trực tiếp tất cả thay đổi của mình cho chi nhánh sản xuất không? Những hạn chế của việc này là gì?

Một trường hợp sử dụng cụ thể mà tôi quan tâm là nếu chúng ta cần thực hiện một hotfix. Chúng tôi hiện đang làm điều này bằng cách phân nhánh từ môi trường sản xuất, thực hiện các thay đổi và sau đó sáp nhập chi nhánh đó trở lại cả phát triển và sản xuất. Nếu nhánh sản xuất khác với phát triển, những thay đổi đó có thể được kéo vào nhánh phát triển khi hotfix được hợp nhất vào phát triển không?

Trả lời

9

Câu hỏi của bạn về cơ bản là "làm cách nào để thực hiện thay đổi trong một chi nhánh và sau đó có thay đổi đó không lan truyền khi tôi hợp nhất thành một nhánh khác?". Điều này là hợp lý đơn giản. Tại thời điểm này, tôi giả sử chi nhánh sản xuất của bạn về cơ bản chỉ là một loạt các hợp nhất, hoặc từ nhánh dev, hoặc từ một nhánh hotfix. Vì vậy, có lẽ làm một git merge production từ chi nhánh phát triển của bạn sẽ không thực hiện bất kỳ thay đổi nào. Cho rằng, hãy tiếp tục và thực hiện thay đổi của bạn cho chi nhánh sản xuất. Bây giờ cam kết chúng. Bây giờ kiểm tra chi nhánh phát triển và chạy git merge -s ours production. Điều này về cơ bản có nghĩa là "hợp nhất từ ​​sản xuất, nhưng từ chối tất cả thay đổi của chúng". Điều này sẽ tạo ra cam kết hợp nhất, nhưng sẽ không thực sự chạm vào nhánh phát triển của bạn. Sau khi hợp nhất này được thực hiện, bây giờ bạn có thể hợp nhất chi nhánh sản xuất của bạn vào phát triển (hay đúng hơn, hợp nhất các nhánh hotfix) mà không cần lo lắng, vì cam kết sản xuất của bạn hiện đã được "hợp nhất" vào phát triển (mặc dù thực tế là tự thay đổi mã đã bị từ chối). Vì vậy, việc hợp nhất các nhánh hotfix của bạn sẽ không kéo vào mã chỉ sản xuất.

Khi bạn đã thực hiện việc này, lần duy nhất bạn cần quay lại và đăng ký lại mẹo này là nếu bạn thực hiện thêm bất kỳ thay đổi nào về sản xuất. Nếu bạn thực hiện thay đổi trên nhánh phát triển xung đột với các thay đổi chỉ sản xuất của bạn, khi hợp nhất phát triển thành sản xuất, bạn có thể tiếp tục và chấp nhận mặt sản xuất của các xung đột mà không gặp vấn đề gì.

+0

ok, vì vậy, điều này không có tác dụng: khi tôi chuyển sang 'git merge development' từ sản xuất bất cứ khi nào tôi phát hành, sự khác biệt trong nhánh phát triển sẽ ghi đè các thay đổi chỉ sản xuất trong chi nhánh sản xuất. tôi cần giữ những thay đổi không rời khỏi nhánh sản xuất - chúng không đi vào bất kỳ chi nhánh nào khác, cũng như chúng không bị ghi đè bởi bất kỳ chi nhánh nào khác. –

+0

@IgorSerebryany: Nếu bạn đang thực hiện các thay đổi về phát triển cho cùng một dòng chính xác mà bạn đang cố gắng bảo toàn trong Sản xuất, thì có, bạn sẽ gặp sự cố. Mỗi khi bạn thực hiện một thay đổi như vậy, bạn phải thực hiện việc kết hợp giả để về cơ bản "nướng trong đá" cách nhánh sản xuất được cho là trông như thế nào đối với các dòng đó. –

+2

tôi đã làm ba lê tinh tế sau đây: (1) chắc chắn rằng hai chi nhánh đã được đồng bộ; (2) tôi áp dụng các thay đổi của mình cho chi nhánh sản xuất (3) 'git merge -s ours production' từ chi nhánh phát triển; (4) 'git merge -s ours development' từ chi nhánh sản xuất. kết quả là, tôi nghĩ rằng tôi đã đạt đến trạng thái tôi muốn, nơi mà những thay đổi của tôi không bị che khuất và không được chuyển ra khỏi sản xuất. –

0

Tôi cũng có yêu cầu này trong chi nhánh dev và chi nhánh sản xuất. Tôi không nghĩ git merge -s của chúng ta ** là một giải pháp tốt vì nó chỉ có thể đảm bảo việc hợp nhất sau này sẽ không được ghi đè, và sau đó nó sẽ gây ra mối quan hệ cha mẹ giữa dev và production. Bạn phải sử dụng git merge -s của chúng ta ** mỗi lần và điều đó sẽ làm cho biểu đồ log thực sự xấu xí và vô nghĩa.

Vì vậy, tôi khuyên bạn sử dụng

git cherry-chọn

. Điều đó đảm bảo nội dung bạn muốn kéo.

Các vấn đề liên quan