2012-03-07 25 views
48

Như tiêu đề cho biết, tôi không thực sự rõ ràng về sự khác biệt giữa git merge --squashgit merge --no-commit. Theo như tôi hiểu trang trợ giúp cho git merge, cả hai lệnh sẽ để lại cho tôi trong một cây làm việc được cập nhật, nơi vẫn có thể chỉnh sửa và sau đó thực hiện cam kết cuối cùng (hoặc nhiều lần commit).Sự khác biệt giữa hợp nhất Git --squash và --no-cam

Ai đó có thể làm rõ sự khác biệt của 2 tùy chọn đó? Khi nào tôi sử dụng cái này thay cho cái kia?

Trả lời

65
git merge --no-commit 

Điều này giống như hợp nhất thông thường nhưng không tạo cam kết hợp nhất. Cam kết này sẽ là một cam kết hợp nhất: khi bạn nhìn vào lịch sử, cam kết của bạn sẽ xuất hiện như một sự hợp nhất bình thường.

git merge --squash 

Điều này sẽ hợp nhất các thay đổi vào cây đang hoạt động của bạn mà không tạo cam kết hợp nhất. Khi bạn cam kết các thay đổi đã hợp nhất, nó sẽ giống như một cam kết "bình thường" mới trên nhánh của bạn: không có một cam kết hợp nhất trong lịch sử. Nó gần giống như bạn đã làm một lựa chọn anh đào trên tất cả các thay đổi hợp nhất.

+0

Vì vậy, cam kết hợp nhất sẽ hiển thị như thế nào trong lịch sử? Vì tôi có thể chỉnh sửa thông điệp cam kết, làm cách nào tôi thấy rằng đó là một cam kết hợp nhất? – quaylar

+2

@quaylar Một cam kết hợp nhất không thực sự là một cam kết đặc biệt, ngoại trừ việc nó có nhiều cha mẹ. Bạn có thể thấy các bậc cha mẹ cho một cam kết ví dụ với 'git log --parents' (và' git log --merges' chỉ hiển thị các commit như vậy). –

+5

@PhilippWendler Vì vậy, về cơ bản: Có một cam kết hợp nhất tôi luôn biết bằng cách nhìn vào lịch sử, rằng cam kết này là kết quả của một hợp nhất (là thông tin mà các chi nhánh đóng góp vào việc hợp nhất này cũng giữ?). Sử dụng --squash không có cách nào để biết rằng cam kết này là kết quả của việc hợp nhất. Tôi có hiểu chính xác không? – quaylar

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