2013-09-27 182 views
7

Giả sử bạn có điều này:Làm thế nào để git merge --squash để github "mạng" sơ đồ cho thấy việc hợp nhất

 master: o--o--o 
development:  `o--o--o 

Tôi muốn kết hợp những thay đổi trở lại như một cam kết (tránh tất cả những rác dọc theo cam kết chiều):

git checkout master 
git merge --squash development 

Nhưng sau đó trang mạng github thấy điều này:

 master: o--o--o---------o 
development:  `o--o--o 

bạn đang phải làm như vậy nó cho thấy những gì bạn mong đợi, ví dụ:

 master: o--o--o---------o 
development:  `o--o--o’ 
+0

Bạn nhận được biểu đồ cuối cùng bằng cách sử dụng 'git merge --no-ff'. Nhưng lưu ý rằng "các cam kết rác" vẫn còn đó. –

+0

Nó cũng đáng chú ý rằng một "hợp nhất bí" không phải là một sự hợp nhất thực sự (như lịch sử của bạn cho bạn thấy); nó thực sự là của một "squash rebase". Bạn có thể sẽ có được những gì bạn thực sự muốn, bằng cách đè bẹp 'phát triển' trước tiên (** lịch sử viết lại **) và sau đó thường kết hợp kết quả thành chính. –

Trả lời

9

Đối với đồ thị cuối cùng, bạn có thể sử dụng lệnh sau:

git merge --no-ff 
git branch -d development 

master: o--o--o---------o 
       `o--o--o’ 

Bạn nói git để tạo ra một hợp nhất cam kết, ngay cả khi sáp nhập nhánh nhanh về phía trước, tức là cam kết cuối cùng của master là một tổ tiên trực tiếp của nhánh được hợp nhất.

Lưu ý rằng "các cam kết rác" sẽ không bị xóa, nhưng trừ khi bạn có lý do thực sự tốt, bạn nên giữ lịch sử của mình theo cách đó. Cam kết bẻ cong làm cho việc duyệt qua lịch sử của bạn trở nên khó khăn.

Nếu bạn cảm thấy lịch sử chi nhánh phát triển của bạn đầy rẫy, bạn cũng có thể viết lại nó trước khi hợp nhất, bằng cách sử dụng một lần rebase tương tác.

git checkout developement 
git rebase -i master 

Bạn sẽ có thể chọn, chỉnh sửa, sắp xếp lại, bí, hoặc hủy cam kết và viết lại lịch sử chi nhánh của bạn. Một khi điều này được thực hiện, sử dụng một hợp nhất cổ điển (có hoặc không có --no-ff, như bạn thích).