2009-09-17 30 views
34

Vì vậy, tôi có một chi nhánh bảo trì và chi nhánh chính trong dự án của tôi. Nếu tôi thực hiện một cam kết tại các chi nhánh bảo trì và muốn kết hợp nó về phía trước để các chi nhánh tổng thể, đó là dễ dàng:Làm thế nào để tôi quay trở lại một cam kết trong git?

git checkout master; git merge maintenance 

Nhưng nếu tôi muốn đi theo con đường khác xung quanh, tức là áp dụng một cam kết thực hiện để làm chủ trở lại chi nhánh bảo trì của tôi, làm thế nào để tôi làm điều đó? Đây có phải là lựa chọn anh đào không? Nó sẽ gây ra vấn đề hoặc xung đột nếu tôi hợp nhất chi nhánh bảo trì chuyển tiếp một lần nữa?

Trả lời

30

Đây chính là trường hợp sử dụng cho git-cherry-pick

git checkout maintenance 
git cherry-pick <commit from master> 
+0

Liên kết bị hỏng. Bạn có tham chiếu mới không? Cảm ơn – glarrain

+1

Tôi đã truy xuất thành công liên kết đó vào ngày 16 tháng 6 năm 2012. – mwalling

+0

Tuyệt vời, đã trở lại. Có lẽ nó chỉ là tạm thời. Cảm ơn @mwalling – glarrain

0

Vâng, nó được coi là cherry-hái và không, thường nó không nên giới thiệu các vấn đề. Nếu cam kết không áp dụng rõ ràng khi quay trở lại, bạn có thể phải đối mặt với cùng một xung đột khi anh đào chọn nó.

0

Theo nguyên tắc chung, tôi sử dụng hợp nhất để di chuyển thay đổi "lên" cây (từ bảo trì đến chính) và rebase để di chuyển chúng "xuống" cây (từ gốc đến bảo trì). Điều này là do đó thứ tự các cam kết trong nhánh chính được duy trì.

Rebase về cơ bản sẽ cuộn lại tất cả các thay đổi của bạn trên nhánh hiện tại sang ngã ba (hoặc lần rebase cuối cùng), sao chép các thay đổi mới hơn và sau đó áp dụng lại các thay đổi của bạn.

Nếu bạn không muốn nhận tất cả thay đổi từ trang cái, thì có thể bạn sẽ cần phải chọn món anh đào mà bạn muốn.

+2

Tôi cũng tự hỏi về * rebase *.Nhưng giả sử một chi nhánh _maintenance_ tồn tại đặc biệt để _not_ có tất cả các thay đổi hiện tại thì đó không phải là những gì bạn muốn. Có vẻ như tốt nhất với tôi để rebase một chi nhánh phát triển, nhưng anh đào-chọn một sửa chữa lỗi được thực hiện trong tổng thể (hoặc bất kỳ chi nhánh phát triển thượng nguồn) trở lại để bảo trì. –

11

giải pháp thay thế cho việc sử dụng "git cherry-pick" (theo khuyến cáo trong phản ứng khác) sẽ được tạo [chủ đề] riêng chi nhánh cho việc sửa chữa tắt chi nhánh bảo trì, và hợp nhất các chi nhánh này đầu tiên vào ngành bảo trì, sau đó vào master branch (trunk).

Quy trình này được (phần nào) được mô tả trong Resolving conflicts/dependencies between topic branches early bài đăng blog của Junio ​​C Hamano, git maintainer.

Kết quả tìm kiếm bằng Cherry theo số cam kết trùng lặp, việc xuống dòng có thể gây ra sự cố khi hợp nhất hoặc rebasing. Luồng công việc dựa trên chủ đề chỉ giữ một bản sao của bản sửa lỗi.

+0

Tôi thích cách bài đăng được liên kết giải thích việc thêm nhiều cam kết có thể xung đột. Kết hợp tính năng A với sửa lỗi B cùng nhau, trước khi hợp nhất một trong hai thành mục Master hoặc Maintenance. Bằng cách này, bạn có thể đảm bảo rằng xung đột giữa A và B được giải quyết, để nếu bạn kéo A hoặc B trước, thì bạn có thể dễ dàng kéo hợp nhất A + B sau đó và biết nó được hợp nhất trước cho bạn. Xem [sơ đồ 3 trong tài liệu được liên kết] (http://gitster.livejournal.com/27297.html). –

0

Như những người khác đã nêu, việc hái hoa anh đào có lẽ là lựa chọn tốt nhất. Tôi chỉ muốn thêm xung đột đó trong quá trình chọn anh đào thường có thể được giải quyết bằng cách kiểm tra "phụ thuộc" của cam kết bạn đang chọn anh đào và tôi đã xây dựng a tool called git-deps để phát hiện và hình dung những phụ thuộc đó. Nếu bạn truy cập trang chủ, bạn sẽ thấy hai video trên YouTube: video đầu tiên giới thiệu chung về công cụ và phần thứ hai minh họa cách sử dụng nó để tránh xung đột khi chọn anh đào.

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