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


190

Чим відрізняються наступні команди ?:

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

Про це посібник розказує:

Порівнюючи гілки

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. Зміни між підказками теми та основними галузями.
  2. Так само, як вище.
  3. Зміни, що відбулися на головній гілці з моменту запуску тематичної гілки.

але мені не зовсім зрозуміло.


Хоча питання не є дублікатом, ця відповідь графічно показує значення ..і ...в, git diffа також їхнє значення в git log.
— Марк Лонгейр

Відповіді:


335

Оскільки я вже створив ці зображення, я подумав, що варто застосувати їх в іншій відповіді, хоча опис різниці між ..(крапка-крапка) та ...(крапка-крапка) по суті такий же, як у відповіді Маноільдса .

Команда git diffзазвичай¹ показує лише різницю станів дерева між рівно двома точками на графіку фіксації. В ..і ...умовних позначеннях в git diffмають таке значення:

Ілюстрація різних способів визначення комітетів для git diff

Іншими словами, git diff foo..barточно такий же, як git diff foo bar; обидва покажуть вам різницю між кінчиками двох гілок fooта bar. З іншого боку, git diff foo...barпокаже вам різницю між "базою злиття" двох гілок і верхівкою bar. "База злиття", як правило, є останньою спільною дією між цими двома гілками, тому ця команда покаже вам зміни, які barбула внесена вашою роботою , ігноруючи все, що було зроблено fooв середній час.

Це все, що потрібно знати про позначення ..та ...позначення в git diff. Однак ...


... загальний джерело плутанини тут є те , що ..і ...означає , тонко різні речі , коли використовується в команді , таких як git log, що очікує набір коммітов як один або більше аргументів. (Ці команди в кінцевому підсумку використовуються git rev-listдля розбору списку комітетів з їх аргументів.)

Значення ..і ...для git logможна зобразити графічно, як показано нижче:

Ілюстрація різних способів визначення діапазонів комітетів для журналу git

Отже, git rev-list foo..barпоказує вам все на гілці, barщо також не є на гілці foo. З іншого боку, git rev-list foo...barпоказує вам усі зобов’язання, які є в обох foo або bar , але не в обох . Третя діаграма просто показує, що якщо ви перерахуєте дві гілки, ви отримаєте коміти, які є в одній або обох.

Ну, я вважаю, що все це трохи заплутано, і я думаю, що діаграми графіків фіксації допомагають :)

¹ Я кажу лише "типово", оскільки, наприклад, при вирішенні конфліктів злиття git diffпоказує вам тристороннє злиття.


1
Мені подобаються ваші діаграми. Я свого часу придумав і своє . У мене є кілька ідей для власних git diffдіаграм, які я викладу пізніше.

34
Хтось помітив? Ефекти ..і ...почуття назад в git diff( по порівнянні з git rev-list)!
— Роберт Сімер

2
Ви мали мене на "Це все, що вам потрібно знати [...]. Однак ...". :-) Git сповнений таких речей, коли подібні позначення та термінологія означають різні речі в різних контекстах; дякую за те, що я це добре пояснив
— ShreevatsaR

Дякуємо, що згадали рев-список. Я зіткнувся з цим питанням, шукаючи способу зробити те, що робить rev-list за допомогою rev-розбору.
— Божевільний фізик

"Іншими словами, git diff foo..barточно так само, як git diff foo bar; обидва покажуть вам різницю між підказками двох гілок футу та смуги." Що саме ви маєте на увазі під "різницею між кінчиками двох гілок"?
— Асад Мосві

60

Моя консолідована версія .. проти … з розл. Проти журналу

Diff vs Log & .. vs ..


3
це було б дуже добре, якби в ньому не було стільки різних кольорів і встановлених операцій, змішаних разом з ../ ...речі. Наприклад, log A...Bнезрозуміло, чи повертає команда перетин (біла частина діаграми) чи інша частина об'єднання AB (зелена). Це було б більше до речі без будь-яких встановлених операндів і лише з 1 кольором.
— xealits

1
Якщо це дійсно diff A..B<-> log A...B, то чи є на самому ділі різниця з 2 точками, відповідають увійти з 3 - ма точками (!)? Або є помилка в зображенні. Якщо дивитися на те, як крапки кольорові, мені здається, на зображенні є помилка друку. Лівий нижній кут: log A...Bповинен бути log A..B, правий (?). І журнал тільки справа має бути ...НЕ ...
— KajMagnus

1
Привіт DolphinDream, дякую за вашу фігуру. Я використовую це як посилання тут: gitlab.com/tortoisegit/tortoisegit/isissue/3427#note_227200695
— Yue Lin Ho

1
@KajMagnus насправді червоний / синій кольори просто використовуються для розмежування 2-х та 3-х крапок (незалежно від того, чи використовуються вони з розмінним або вхідним журналом). Діаграма правильна. У першому стовпчику результат розрізнення з двоточковими аналогічним є журналу з 3-крапними (звідси і вся діаграма цілей, для початку). Відмінність із 2-крапковими кодами дає зміни коду обох оборотів до точки розбіжності (проілюстровано зеленими бульбашками навколо комірок та зеленими частинами діаграм ван), а журнал із 3-крапками дає журнали змін (виконувати повідомлення) в обох оборотах до точки розбіжності.
— DolphinDream

28

git diff foo master Різниця між вершиною (головою) виконує фу та голову.

git diff foo..master Ще один спосіб зробити те ж саме.

git diff foo...master Відмінність від загального предка (git merge-base foo master ) foo та господаря до кінця master. Іншими словами, показує лише ті зміни, які ввела головна галузь з часів свого спільного предка з foo.

Цей приклад від GitHub пояснює, коли використовувати два:

Наприклад, якщо ви створили гілку 'dev' і додали функцію до файлу, поверніться до своєї гілки 'master' та видаліть рядок з README, а потім запустіть щось подібне:

$ git diff master dev

Він скаже вам, що функція була додана з першого файлу та додано рядок до README. Чому? Оскільки на гілці у README все ще є оригінальний рядок, але на "master" ви її видалили - тому безпосередньо порівняння знімків виглядає так, що "dev" додав його.

Те, що ви насправді хочете порівняти, - це те, що "dev" змінилося з часу розходження ваших гілок. Для цього у Git є невелика стенограма:

$ git diff master...dev

2
git diff foo ... майстер змін, які запровадив гілка master, оскільки це спільний пращур з foo
— 0fnt

@manojlds гаразд, настільки інше питання, якщо ви знаходитесь у відділенні розробників і здійснюєте свої зміни (функцію) і натискаєте зміни у віддалену гілку розробників, це означає, що видима зміна є лише функцією чи функцією та readme?
— Девід

Якщо я не помиляюся, у запиті на притягування GitHub diff використовується потрійна точка. Це так?
— Shaun Luttin

Перерване посилання на сторінку прикладу GitHub.
— К.-Майкл

6
git diff foo master

покаже відмінності між темою та головною галуззю в той момент часу

git diff foo..master

це також покаже відмінності між темою та головною галуззю в цей момент часу

git diff foo...master

це покаже всі відмінності між тим, коли тема робилася з гілки та після

тож перші 2 команди однакові, а остання лише показує ширший погляд в історії розбіжностей


1

git журнал дерево

Верхня картина еквівалентна дереву нижньої графіки

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

Малюнок вартує тисячі слів, різниця між ними .. ... ^показана нижче.

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.