Які відмінності між подвійною крапкою ".." та потрійною точкою "..." в діапазонах 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.