Câu trả lời:
Nó phụ thuộc vào việc bạn đang sử dụng một log
lệnh hay một diff
lệnh. Trong log
trường hợp, đó là trong man git-rev-parse
tà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 diff
trường hợp, đó là trong man git-diff
tà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-diff
trường hợp, nó giống như a git diff A B
và chỉ khác A so với B. Trong log
trườ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.
..
và ...
được chính xác hoán đổi cho đăng nhập và diff: log A..B
là thay đổi từ cơ sở hợp nhất đến B đó là những gì diff A...B
làm
git diff
.
A...B
== A..B + B..A
?
git log
điều này là hoàn toàn có
Khi bạn đang sử dụng phạm vi cam kết như ..
và ...
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ẻ .
Đâ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:
Đâ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:
...
hữu ích hơnBạ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-right
tù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ề master
tiền tố <
, trong khi các cam kết thuộc về origin/master
tiền tố >
.
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? .