Sự khác biệt giữa hai dấu chấm chấm .. Tấn và ba dấu chấm Tấn trong phạm vi cam kết Git diff là gì?


188

Sự khác biệt giữa các lệnh sau là gì?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

Hướng dẫn sử dụng khác nói về nó:

So sánh các chi nhánh

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. Thay đổi giữa các mẹo của chủ đề và các nhánh chính.
  2. Giống như trên.
  3. Những thay đổi xảy ra trên nhánh chính kể từ khi nhánh chủ đề được bắt đầu.

nhưng không hoàn toàn rõ ràng với tôi.


Trong khi câu hỏi không phải là một bản sao, câu trả lời này cho thấy đồ họa ý nghĩa của .....trong git diffvà ý nghĩa khác nhau của chúng trong git log.
Mark Longair

Câu trả lời:


333

Vì tôi đã tạo ra những hình ảnh này, tôi nghĩ rằng có thể đáng để sử dụng chúng trong một câu trả lời khác, mặc dù mô tả về sự khác biệt giữa ..(dấu chấm) và ...(dấu chấm-chấm) về cơ bản giống như trong câu trả lời của manojlds .

Lệnh git diffthường¹ chỉ cho bạn thấy sự khác biệt giữa các trạng thái của cây giữa chính xác hai điểm trong biểu đồ cam kết. Các .....ký hiệu trong git diffcó ý nghĩa như sau:

Một minh họa về các cách khác nhau để xác định các cam kết cho git diff

Nói cách khác, git diff foo..bargiống hệt như git diff foo bar; cả hai sẽ cho bạn thấy sự khác biệt giữa các mẹo của hai nhánh foobar. Mặt khác, git diff foo...barsẽ cho bạn thấy sự khác biệt giữa "cơ sở hợp nhất" của hai nhánh và đỉnh của bar. "Cơ sở hợp nhất" thường là điểm chung cuối cùng giữa hai nhánh đó, vì vậy lệnh này sẽ cho bạn thấy những thay đổi mà công việc của bạn barđã đưa ra, trong khi bỏ qua mọi thứ đã được thực hiện footrong thời gian trung bình.

Đó là tất cả những gì bạn cần biết về .....ký hiệu trong git diff. Tuy nhiên...


... Một nguồn gây nhầm lẫn phổ biến ở đây là điều đó .....có nghĩa là những thứ khác nhau một cách tinh tế khi được sử dụng trong một lệnh như git logmong đợi một tập hợp các xác nhận là một hoặc nhiều đối số. (Tất cả các lệnh này đều kết thúc bằng cách sử dụng git rev-listđể phân tích một danh sách các xác nhận từ các đối số của chúng.)

Ý nghĩa của .....cho git logcó thể được hiển thị bằng đồ họa như dưới đây:

Một minh họa về các cách khác nhau để chỉ định phạm vi cam kết cho nhật ký git

Vì vậy, git rev-list foo..barcho bạn thấy tất cả mọi thứ trên chi nhánh barcũng không phải trên chi nhánh foo. Mặt khác, git rev-list foo...barcho bạn thấy tất cả các cam kết trong một foo hoặc bar , nhưng không phải cả hai . Sơ đồ thứ ba chỉ cho thấy rằng nếu bạn liệt kê hai nhánh, bạn sẽ nhận được các cam kết nằm trong một hoặc cả hai.

Chà, dù sao thì tôi cũng thấy hơi khó hiểu và tôi nghĩ rằng biểu đồ cam kết sẽ giúp :)

Tôi chỉ nói "thông thường" vì khi giải quyết xung đột hợp nhất, chẳng hạn, git diffsẽ cho bạn thấy hợp nhất ba chiều.


1
Tôi thích sơ đồ của bạn. Tôi cũng đã nghĩ ra cách đây một thời gian . Tôi có một số ý tưởng cho git diffsơ đồ của riêng tôi mà tôi sẽ thực hiện sau này.

34
Có ai để ý không? Các tác động của .....cảm thấy đảo ngược trong git diff(so với git rev-list)!
Robert Siemer

2
Bạn đã cho tôi tại "Đó là tất cả những gì bạn cần biết [...]. Tuy nhiên ...". :-) Git có đầy đủ những thứ như thế này trong đó ký hiệu và thuật ngữ tương tự có nghĩa là những thứ khác nhau trong các bối cảnh khác nhau; cảm ơn vì đã làm rõ điều này
ShreevatsaR

Cảm ơn đã đề cập đến danh sách rev. Tôi đã bắt gặp câu hỏi này trong khi tìm cách thực hiện những gì danh sách rev làm thông qua rev-parse.
Nhà vật lý điên

"Nói cách khác, git diff foo..bargiống hệt như git diff foo bar; cả hai sẽ cho bạn thấy sự khác biệt giữa các mẹo của hai nhánh foo và bar." Chính xác thì bạn có ý gì bởi "sự khác biệt giữa các mẹo của hai nhánh"?
Asad Moosvi

59

Phiên bản hợp nhất của tôi về .. vs ... với diff vs log

Khác biệt so với Đăng nhập & .. vs ..


3
Điều này sẽ rất tốt, nếu chỉ có nó không có quá nhiều màu sắc khác nhau và thiết lập các thao tác trộn lẫn với ../ ...công cụ. Ví dụ trong log A...Bđó không rõ liệu lệnh trả về giao điểm (phần màu trắng của sơ đồ) hay phần còn lại của liên kết AB (màu xanh lá cây). Nó sẽ là nhiều hơn đến điểm mà không có bất kỳ toán hạng được thiết lập và chỉ có 1 màu.
xealits

1
Điều này có thực sự là diff A..B<-> log A...B, nghĩa là, có thực sự khác biệt với 2 dấu chấm, tương ứng với nhật ký với 3 dấu chấm (!) Không? Hoặc là có một lỗi đánh máy trong hình ảnh. Nhìn vào cách các chấm được mã hóa màu, dường như tôi có một lỗi đánh máy trong ảnh. Góc dưới bên trái: log A...Bnên log A..B, phải (?). Và log chỉ sang bên phải nên ...không ...
KajMagnus

1
Xin chào DolphinDream, cảm ơn vì con số của bạn. Tôi sử dụng nó làm tài liệu tham khảo ở đây: gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
Yue Lin Ho

1
@KajMagnus thực sự các màu đỏ / xanh chỉ được sử dụng để phân biệt giữa 2 chấm và 3 chấm (bất kể được sử dụng với diff hay log). Sơ đồ là chính xác. Trong cột đầu tiên, kết quả của diff với 2 chấm tương tự như nhật ký với 3 chấm (do đó toàn bộ sơ đồ mục đích bắt đầu). Khác biệt với 2 chấm cho mã thay đổi ở cả hai vòng quay xuống điểm phân kỳ (được minh họa bằng các bong bóng màu xanh lá cây xung quanh các cam kết và các phần màu xanh lục của sơ đồ van) trong khi nhật ký với 3 chấm cung cấp nhật ký thay đổi (thông báo cam kết) trong cả hai vòng quay xuống điểm phân kỳ.
Cá heo

28

git diff foo master Khác nhau giữa các cam kết trên cùng (đầu) của foo và chủ.

git diff foo..master Một cách khác để làm điều tương tự.

git diff foo...masterKhác nhau từ tổ tiên chung ( git merge-base foo master) của foo và chủ đến đỉnh của chủ. Nói cách khác, chỉ hiển thị những thay đổi mà nhánh chủ đã đưa ra kể từ khi tổ tiên chung của nó với foo.

Ví dụ này từ GitHub giải thích khi nào nên sử dụng hai:

Chẳng hạn, nếu bạn tạo một nhánh 'dev' và thêm một hàm vào một tệp, sau đó quay lại nhánh 'master' của bạn và xóa một dòng khỏi README, rồi chạy một cái gì đó như thế này:

$ git diff master dev

Nó sẽ cho bạn biết rằng một chức năng đã được thêm vào từ tệp đầu tiên và một dòng đã được thêm vào README. Tại sao? Bởi vì trên nhánh, README vẫn có dòng gốc, nhưng trên 'master' bạn đã xóa nó - vì vậy, so sánh trực tiếp các ảnh chụp nhanh trông giống như 'dev' đã thêm nó.

Những gì bạn thực sự muốn so sánh là những gì 'dev' đã thay đổi kể từ khi các chi nhánh của bạn chuyển hướng. Để làm điều đó, Git có một tốc ký nhỏ:

$ git diff master...dev

2
git diff foo ... những thay đổi chính mà nhánh chủ đã giới thiệu vì tổ tiên chung của nó với foo
0fnt

@manojlds ok, câu hỏi khác nhau, nếu bạn ở nhánh dev và thực hiện các thay đổi của mình (hàm) và đẩy các thay đổi vào nhánh dev từ xa, điều này có nghĩa là thay đổi có thể nhìn thấy chỉ là hàm hoặc hàm và readme?
David

Nếu tôi không nhầm, yêu cầu kéo của GitHub sử dụng dấu ba chấm. Có đúng không?
Shaun Luttin

Liên kết bị hỏng đến trang ví dụ GitHub.
K.-Michael Aye

6
git diff foo master

sẽ cho thấy sự khác biệt giữa chủ đề và chi nhánh chính tại thời điểm đó

git diff foo..master

điều này cũng sẽ cho thấy sự khác biệt giữa chủ đề và nhánh chính trong thời điểm đó

git diff foo...master

điều này sẽ cho thấy tất cả sự khác biệt giữa khi chủ đề được thực hiện từ chi nhánh và sau đó

vì vậy 2 lệnh đầu tiên giống nhau và lệnh cuối chỉ hiển thị chế độ xem rộng hơn trong lịch sử tìm khác biệt


1

cây gỗ git

Hình trên cùng tương đương với cây đồ thị phía dưới

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

Một bức tranh đáng giá ngàn lời nói, sự khác biệt giữa .. ... ^được hiển thị bên dưới.

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.