2010-12-28 35 views
8

Tôi có hai lần commit, một trong số đó là tổ tiên của một commit khác. (Chúng xảy ra là điểm bắt đầu và kết thúc của một chi nhánh. Tôi không nghĩ rằng vấn đề, nhưng tôi sẽ bao gồm nó nếu nó).Hiển thị sự khác biệt không hợp nhất cho hai cam kết trong git

Tôi muốn thấy sự khác biệt giữa hai cam kết, nhưng không bao gồm thay đổi được thực hiện trong quá trình hợp nhất (nghĩa là tất cả các cam kết có nhiều hơn một phụ huynh) được thực hiện giữa hai lần commit. (Về cơ bản, tôi muốn có bất kỳ cam kết "thực" nào đã được thực hiện cho chi nhánh, trừ các hợp nhất.)

Điều này có khả thi không? Nếu vậy, làm thế nào để bạn thực hiện điều này?

Nếu cần, giả sử không có xung đột nào được giải quyết trong quá trình hợp nhất ... nhưng điểm thưởng cho giải pháp có thể xử lý chúng một cách trang nhã.

+0

Hãy làm rõ: bạn có muốn một sự khác biệt riêng cho từng cam kết không phải là cam kết hợp nhất hay bạn mong đợi điều gì đó khác? –

+0

@Autocracy: Tôi đã chỉnh sửa nó và hy vọng làm rõ những gì tôi đang tìm kiếm. Hãy cho tôi biết nếu nó vẫn không có ý nghĩa. –

Trả lời

7

Câu hỏi của bạn hơi mơ hồ nhưng tôi nghĩ bạn muốn điều này.

git log --no-merges -p branch-start..branch-end 
+0

Bạn cũng có thể thích '--first-parent'. –

+1

-p là vé, khi kết hợp với --no-merges. Cảm ơn! –

+0

Đó là một sự xấu hổ bạn không thể làm điều này (tạo ra một phạm vi) chống lại lưu trữ/hiện tại (không cam kết) ... bạn có thể nhận được sự khác biệt với 'git diff $ (git merge-base branchA currentbranch)'. Sulk! –

2

Tôi không biết --no-hòa trộn -o tùy chọn nhưng ở đây một giải pháp khác (tôi giả sử rằng hòa trộn đã được thực hiện từ thạc sĩ):

git checkout -b temp 
git rebase --onto master branch-start branch-end 
git diff master 
2

Nếu hòa trộn của bạn tất cả xuất phát từ cùng một chi nhánh (nói master) hoặc tất cả được chứa trong một chi nhánh khác, bạn có thể sử dụng số solution từ this question.

Giả sử bạn có một cây như sau:

  x---y-+-z-+-branch 
     / //
---a---b---c-+-d-+-e---master 

và hai cam kết mà bạn muốn so sánh là bbranch. Sau đó, thay vì so sánh hai cam kết trực tiếp, chạy

git diff master...branch 

sẽ hiển thị tất cả các thay đổi được thực hiện trên các chi nhánh (x,y,z) không bao gồm tất cả mọi thứ đó cũng là trên master (c,d,e, thao tác trộn). Lưu ý rằng điều này cũng bỏ qua bất kỳ thay đổi nào được thực hiện trên bản gốc mà chưa có trong nhánh.

Từ các tài liệu:

git diff [--options] cam ... cam kết [-] [...]

Hình thức này là để xem những thay đổi trên nhánh chứa và đến cam kết thứ hai, bắt đầu từ tổ tiên chung của cả hai cam kết . "git diff A ... B" tương đương với "git diff $ (git-merge-base A B) B".

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