Які відмінності між подвійною крапкою ".." та потрійною точкою "..." в діапазонах Git-комітетів?


412

Деякі команди Git приймають діапазони фіксування, а один допустимий синтаксис - це розділити два імена фіксування на дві крапки .., а інший синтаксис використовує три крапки ....

Які відмінності між ними?


Відповіді:


251

Це залежить від того, використовуєте ви logкоманду чи diffкоманду. У logвипадку, це в man git-rev-parseдокументації:

Щоб виключити доступ, який можна отримати з комісії, використовується префікс ^ нотація. Наприклад, ^ r1 r2 означає, що здійснює доступ з r2, але виключає ті, досяжні з r1.

Ця операція набору з’являється настільки часто, що для неї є скорочення. Якщо у вас є два комітети r1 і r2 (названі відповідно до синтаксису, поясненого в СПЕЦІФІКУВАННІ РЕЦІЗІЙ вище), ви можете попросити комітети, доступні з r2, за винятком тих, які є доступними з r1, за допомогою "^ r1 r2", і це може бути записано як "r1..r2".

Подібне позначення "r1 ... r2" називається симетричною різницею r1 і r2 і визначається як "r1 r2 - not $ (git merge-base --all r1 r2)". Це набір комітетів, які доступні або з одного з r1, або r2, але не з обох.

Це в основному означає, що ви отримаєте всі коміти, які знаходяться в будь-якій з двох гілок, але не в обох.

У diffвипадку, це в man git-diffдокументації:

  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.

Що трохи нечітко. В основному це означає, що він показує лише відмінності в цій гілці порівняно з іншою гілкою: вона шукає останню спільну команду з першим комітетом, який ви їй дали, а потім відрізняє другий комітет від цього. Це простий спосіб зрозуміти, які зміни вносяться в цій галузі, порівняно з цією галуззю, не помічаючи зміни лише у цій галузі.

The ..Трохи простіше: У git-diffразі, це те ж саме , як git diff A Bі просто диференціали А проти В. В logразі, він показує всі коммітов , які знаходяться в B , але не в А.


31
Досить смішно, як значення ..та ...точно поміняється на журнал і різняться: чи log A..Bє зміни від бази злиття до B, що це diff A...Bробить
phiresky

1
@phiresky Так, це дійсно погана юзабіліті. Я рекомендую не використовувати позначення крапок для git diff.
wisbucky

2
Це означає A...B== A..B + B..A?
Данон

2
@Danon для git logцього абсолютно так
maoizm

659

Використання діапазонів фіксації за допомогою Git Log

Коли ви використовуєте діапазони фіксування, як ..і ...з git log, різниця між ними полягає в тому, що для гілок A і B,

git log A..B

покаже вам все коммітов , що B має , що А не має , в той час як

git log A...B

покаже вам і ті зобов’язання, які має A, і B, і B, і B, які A не мають, або іншими словами, він відфільтрує всі зобов’язання, які поділяють і A, і B, таким чином показуючи лише ті зобов'язання, які вони не поділяють .

Візуалізація за допомогою діаграм Венна та обрізання дерев

Ось наочне зображення git log A..B. Коміти, які містить гілка B, які не існують в A, - це те, що повертається діапазоном фіксації, і виділяється червоним кольором на діаграмі Венна, і обводиться синім кольором у дереві комірок:

 діаграма "git log A..B"Дерево 1

Це діаграми для git log A...B. Зауважте, що коміти, якими поділяються обидві гілки, не повертаються командою:

 діаграма "git log A ... B"Дерево 2

Створення діапазону трійчастої фіксації ... більш корисним

Ви можете зробити діапазон трійчастої фіксації ...більш корисним у команді журналу, скориставшись --left-rightопцією, щоб показати, які коміти належать до тієї гілки:

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

У наведеному вище висновку ви побачите, до яких належать masterпрефікси <, а до origin/masterних належать префікси >.

Використання діапазонів фіксації за допомогою Git Diff

Колись я можу додати своє власне пояснення того, як працюють діапазони фіксації git diff, але наразі ви можете перевірити, які відмінності між подвійною крапкою ".." і потрійною точкою "..." в Git diff commit діапазони? .

Дивись також


35
Ця відповідь фактично пояснює різницю стислим текстом, прикладами та малюнками. Мені це подобається набагато краще, ніж відповідь, що голосує зараз у верхній частині, яка просто цитує незрозумілу документацію. (tl; dr. завдяки цій відповіді я насправді розумію різницю.)
aerique

4
@Cupcake Ви можете додати значення off ... in git diff?
Маріус

1
@Marius насправді, тепер, коли ти це викладеш, я продовжую і посилаюся на це інше питання у своїй відповіді, для майбутніх читачів, як ти.

2
Хіба це насправді не навпаки? dig diff a..b ВСЕ різниться, або в основному таке ж, як git diff a b. В той час, як git dif a ... b - ТІЛЬКИ зміни b були внесені з моменту розгалуження на a.
wejrowski

2
Принаймні для git log. Для git diff, можливо, все перевернуто: stackoverflow.com/questions/7251477/…
Бенджамін Аткін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.