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 là gì?


Câu trả lời:


251

Nó phụ thuộc vào việc bạn đang sử dụng một loglệnh hay một difflệnh. Trong logtrường hợp, đó là trong man git-rev-parsetài liệu:

Để loại trừ các xác nhận có thể truy cập từ một cam kết, một ký hiệu ^ tiền tố được sử dụng. Ví dụ ^ r1 r2 có nghĩa là các xác nhận có thể truy cập được từ r2 nhưng loại trừ các xác nhận có thể truy cập được từ r1.

Thao tác thiết lập này xuất hiện thường xuyên đến nỗi có một tốc ký cho nó. Khi bạn có hai lần xác nhận r1 và r2 (được đặt tên theo cú pháp được giải thích trong ĐẶC BIỆT CÁCH MẠNG ở trên), bạn có thể yêu cầu các cam kết có thể truy cập từ r2 trừ các trường hợp có thể truy cập từ r1 bằng "^ r1 r2" và nó có thể được viết là "r1..r2".

Một ký hiệu tương tự "r1 ... r2" được gọi là sự khác biệt đối xứng của r1 và r2 và được định nghĩa là "r1 r2 --not $ (git merge-base --all r1 r2)". Đó là tập hợp các cam kết có thể truy cập từ một trong hai r1 hoặc r2 nhưng không phải từ cả hai.

Điều đó về cơ bản có nghĩa là bạn sẽ nhận được tất cả các cam kết ở một trong hai nhánh, nhưng không phải ở cả hai.

Trong difftrường hợp, đó là trong man git-difftài liệu:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

Mà hơi mờ. Về cơ bản, điều đó có nghĩa là nó chỉ thể hiện sự khác biệt trong nhánh đó so với nhánh khác: nó tìm kiếm cam kết chung cuối cùng với ủy ban đầu tiên bạn đưa ra, và sau đó khác với ủy ban thứ hai với điều đó. Đó là một cách dễ dàng để xem những thay đổi được thực hiện trong chi nhánh đó, so với chi nhánh này mà không cần thông báo về những thay đổi trong chi nhánh này.

Điều ..này có phần đơn giản hơn: Trong git-difftrường hợp, nó giống như a git diff A Bvà chỉ khác A so với B. Trong logtrường hợp, nó hiển thị tất cả các cam kết nằm trong B nhưng không phải ở A.


31
Nó khá vô lý như thế nào nghĩa của .....được chính xác hoán đổi cho đăng nhập và diff: log A..Blà thay đổi từ cơ sở hợp nhất đến B đó là những gì diff A...Blàm
phiresky

1
@phiresky Vâng, đó là khả năng sử dụng thực sự kém. Tôi khuyên bạn không nên sử dụng các ký hiệu chấm cho git diff.
wvducky

2
Điều này có nghĩa là A...B== A..B + B..A?
Danon

2
@Danon cho git logđiều này là hoàn toàn có
maoizm

659

Sử dụng Phạm vi Cam kết với Nhật ký Git

Khi bạn đang sử dụng phạm vi cam kết như .....với git log, sự khác biệt giữa chúng là, đối với các nhánh A và B,

git log A..B

sẽ cho bạn thấy tất cả các cam kết mà B có mà A không có , trong khi

git log A...B

sẽ cho bạn thấy cả hai cam kết mà A có và B không có, và các cam kết mà B có mà A không có, hay nói cách khác, nó sẽ lọc ra tất cả các cam kết mà cả A và B chia sẻ, do đó chỉ hiển thị các cam kết mà cả hai không chia sẻ .

Trực quan hóa với Sơ đồ Venn & Cây cam kết

Đây là một đại diện trực quan của git log A..B. Các cam kết mà nhánh B chứa không tồn tại trong A là những gì được trả về bởi phạm vi cam kết và được tô sáng màu đỏ trong sơ đồ Venn và được khoanh tròn màu xanh lam trong cây cam kết:

 Sơ đồ "git log A..B"Cây 1

Đây là những sơ đồ cho git log A...B. Lưu ý rằng các cam kết được chia sẻ bởi cả hai nhánh không được trả về bởi lệnh:

 Sơ đồ "git log A ... B"Cây 2

Làm cho phạm vi cam kết ba điểm trở nên ...hữu ích hơn

Bạn có thể làm cho phạm vi cam kết ba chấm ...trở nên hữu ích hơn trong lệnh log bằng cách sử dụng --left-righttùy chọn để hiển thị các xác nhận thuộc về nhánh nào:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

Trong kết quả đầu ra ở trên, bạn sẽ thấy các cam kết thuộc về mastertiền tố <, trong khi các cam kết thuộc về origin/mastertiền tố >.

Sử dụng Phạm vi Cam kết với Git Diff

Một ngày nào đó tôi có thể thêm lời giải thích của riêng mình về cách các phạm vi cam kết hoạt động git diff, nhưng bây giờ, bạn có thể muốn kiểm tra sự khác biệt giữa dấu chấm kép ".." và dấu ba chấm "..." trong Git diff commit các dãy? .

Xem thêm


35
Câu trả lời này thực sự giải thích sự khác biệt với một văn bản, ví dụ và hình ảnh súc tích. Tôi thích nó tốt hơn nhiều so với câu trả lời được bình chọn hàng đầu hiện nay chỉ trích dẫn các tài liệu không rõ ràng. (tl; dr nhờ câu trả lời này, tôi thực sự hiểu sự khác biệt.)
aerique

4
@Cupdding bạn có thể thêm ý nghĩa tắt ... trong git diff?
Marius

1
@Marius thực sự, bây giờ khi bạn đưa nó lên, tôi sẽ tiếp tục và liên kết với câu hỏi khác trong câu trả lời của tôi, cho những độc giả tương lai như bạn.

2
Đây thực sự không phải là ngược lại? dig diff a..b là ALL diffs, hoặc về cơ bản giống như git diff a b. Trong khi git Dif a ... b là CHỈ thay đổi b đã thực hiện kể từ khi phân nhánh từ a.
wejrowski

2
Ít nhất là cho nhật ký git. Đối với git diff, mọi thứ có thể bị đảo ngược: stackoverflow.com/questions/7251477/ Kẻ
Benjamin Atkin
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.