2011-09-20 20 views
10

Hãy nói rằng tôi có tình huống sau đây:Git khác về chủ đề chi nhánh, ngoại trừ các cam kết hợp nhất đã xảy ra trong thời gian chờ đợi?

B---D---F---G topic 
/ /
--A---C---E master 

Đối với mục đích xem xét mã, tôi muốn kéo ra một diff từ cam A đến cam G, nhưng không bao gồm E cam kết và C mà đã xảy ra trên các chi nhánh chủ và cũng không bao gồm cam kết F là cam kết hợp nhất.

Nói cách khác, tôi muốn tạo ra một diff có chứa thay đổi từ F đến G và tổng hợp những thay đổi với những thay đổi từ A đến D.

Trong khác-Nói cách khác, tôi muốn diff xem xét lại để chứa chỉ những thay đổi của tôi từ nhánh chủ đề, không bao gồm một loạt mã từ chủ đã xảy ra trong thời gian chờ đợi.

Điều này có khả thi không? Nếu git không thể xử lý "các tập hợp khác" như vậy, tôi sẽ rất biết ơn nếu ai đó có thể cung cấp một số gợi ý về cách một số lệnh bên ngoài có thể thực hiện điều đó (để tôi có thể thử viết một script bash để thực hiện thủ thuật).

+0

Điều gì về việc kiểm xuất tệp trong A và G cam kết riêng biệt và tạo sự khác biệt vim ??? –

+0

Tôi cần sự khác biệt cho tất cả các tệp, không phải là một tệp. Ngoài ra, tôi nghĩ những gì bạn đang đề xuất cũng sẽ bao gồm các thay đổi được giới thiệu bởi cam kết hợp nhất. –

Trả lời

4

Nếu bạn không quan tâm những gì trong phần "ngữ cảnh" của các khác biệt, thì git diff master..topic sẽ cung cấp cho bạn những gì bạn muốn. Mọi thay đổi được giới thiệu trong CE được coi là một phần của "cơ sở" của khác biệt, do đó, các thay đổi từ master sẽ có trong ngữ cảnh, nhưng chỉ những thay đổi thực tế được thực hiện trong nhánh chủ đề của bạn sẽ được đánh dấu bằng + hoặc -. . Đó thường là những gì mọi người muốn đánh giá mã.

Nếu thay vào đó bạn muốn hành động như việc hợp nhất chưa từng xảy ra, bạn sẽ phải rebase nó ra:

git rebase --onto A master 
+2

Cảm ơn Karl, 'git diff master..topic' đã thực hiện thủ thuật. Nó chỉ ra rằng tôi đã hợp nhất chủ thành chủ đề trước khi chạy kịch bản khác. –

1

gì về:

  1. git checkout chủ đề

  2. git checkout -b tạm

  3. git trở F

  4. git diff Một

Sau đó bạn có thể vui vẻ loại bỏ nhánh tạm thời.

1

Câu trả lời từ Karl là sai lầm:

git diff không bao giờ hoạt động trên dãy thích hợp (nghĩa là nhiều cam kết), chỉ giữa hai cam kết!

Cú pháp phạm vi có ý nghĩa đặc biệt đối với git diff.

git diff E..G luôn bằng git diff E G (và
git diff E...G bằng git diff E G trong trường hợp này, bởi vì E là merge-base giữa hai).

git diff master...topic là những gì bạn muốn trong này và trong trường hợp tổng quát: nó cho bạn thấy tất cả những thay đổi của chi nhánh chủ đề, so sánh nó với cuối merge-base (tức là tương phản nó để làm chủ khi nó được sáp nhập lần cuối cùng , bỏ qua tất cả các thay đổi sau này trong bản chính mà cũng không nằm trong nhánh chủ đề của bạn).

Lưu ý: (? Bởi sự trùng hợp) tiếc là ảnh hưởng của x..y trong git log vv được thể hiện tốt nhất bằng x...y trong git diff và ngược lại!

+1

Vâng, đây là câu trả lời đúng. Từ hướng dẫn: "git diff A ... B" tương đương với "git diff $ (git-merge-base A B) B". – jmiserez

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