Почему GitHub показывает изменения при сравнении двух одинаковых веток?

Я создал тестовый репозиторий: https://github.com/Labutin/CompareBranches Попробуем клонировать и сравнить две ветки branch_01 и branch_02

$ git clone https://github.com/Labutin/CompareBranches.git
Cloning into 'CompareBranches'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.

$ git diff remotes/origin/branch_01..remotes/origin/branch_02 --exit-code
$ echo $?
0

Итак, у нас есть две идентичные ветви.

Но если я попытаюсь использовать веб-интерфейс для сравнения двух веток https://github.com/Labutin/CompareBranches/compare/branch_01...branch_02, он показывает, что 1 файл изменен. Почему? Что не так с веб-интерфейсом? Может мне нужно изменить URL?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
1 151
2

Ответы 2

Обратите внимание на тройную точку в URL-адресе Github. Github делает git diff remotes/origin/branch_01...remotes/origin/branch_02. r1..r2 немного отличается от r1...r2.

r1..r2 запрашивает все коммиты, доступные от r2, кроме тех, которые доступны для r1.

r1...r2 запрашивает "все коммиты, доступные по любой из двух ссылок, но не по обеим."

Давайте посмотрим на них в вашем репо.

A - B [branch_02]
 \
  C [branch_01]

git log branch_01..branch_02 дает нам B. branch_02 может достигать A и B, но branch_01 также может достигать A, так что это дает нам B.

git log branch_01..branch_02 дает нам B и C. branch_01 может достигать A и C. branch_02 может достигать A и B. Обе ветви могут достигать A, поэтому он исключен. Остались B и C.

Для получения дополнительной информации см. Выбор редакции, двойная точка и тройная точка в Pro Git.

Похоже, GitHub вообще не «делает» двухточечное сравнение.

torek 10.08.2018 00:24

Похоже, две точки не работают. Попробуйте github.com/Labutin/CompareBranches/compare/branch_01..branch‌ _03 Ветки не равны.

dhythhsba 10.08.2018 00:26

@dhythhsba Думаю, ты прав. Похоже, Github интерпретирует branch_01..branch_03 как ссылку и по умолчанию устанавливает базу на master. Вместо того, чтобы выдавать ошибку из-за того, что ссылка не существует, она не сообщает о разнице. Например, github.com/Labutin/CompareBranches/compare/aldkflakjfkjd

Schwern 10.08.2018 00:39

Этот вопрос действительно о GitHub, но мы можем использовать его для строить вопроса о Git.

После клонирования вашего репозитория:

$ git clone https://github.com/Labutin/CompareBranches.git
Cloning into 'CompareBranches'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0

Я могу просмотреть в нем все коммиты:

$ cd CompareBranches
$ git log --all --decorate --oneline --graph
* 5707453 (origin/branch_02) Commit to branch_02
| * c0e3722 (origin/branch_01) commit to branch_01
|/  
* 0e9a4e3 (HEAD -> master, origin/master, origin/HEAD) Initial commit

Итак, есть три коммита, фактические (но сокращенные) имена которых - 0e9a4e3, c0e3722 и 5707453. имя удаленного отслеживанияorigin/master относится к первой фиксации, а два других имени удаленного отслеживания origin/branch_01 и origin/branch_02 относятся к двум другим фиксациям.

Если мы попросим Git сравнить коммиты c0e3722 и 5707453, мы не увидим разницы:

$ git diff c0e3722 5707453

Но если мы попросим Git сравнить, скажем, фиксацию 0e9a4e3 с фиксацией 5707453, мы увидим, что эти два фиксирует являются по-разному:

$ git diff 0e9a4e3 5707453
diff --git a/README.md b/README.md
index f00f3be..b183451 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-# CompareBranches
\ No newline at end of file
+# CompareBranches
+commit1

Поскольку коммиты c0e3722 и 5707453 имеют одинаковое содержимое, сравнение 0e9a4e3 с любым из них покажет такое же изменение.

Команда git diff имеет специальный синтаксис

Когда мы хотим сравнить две фиксации, мы можем запустить:

git diff <thing-1> <thing-2>

и Git сравнит вещь-1 с вещью-2. Часть внутри угловых скобок может быть чем угодно, что идентифицирует фиксацию: например, необработанным идентификатором хэша, таким как 0e9a4e3, или именем ветки, или именем удаленного отслеживания.

Если мы запустим:

git diff <thing-1>..<thing-2>

Git выполняет точно так же:, он сравнивает две вещи.

Но, если использовать точки три вместо двух:

git diff <thing-1>...<thing-2>

Git делает что-то особенное. Вместо сравнения двух названных нами коммитов Git находит коммит в третьих. В частности, Git ищет коммит база слияния, из которого происходят оба названных коммита. Мы видим это в выходных данных git log --graph выше: оба коммита происходят от коммита 0e9a4e3. Итак, это база слияния, и, следовательно, с точками три вместо двух, это фиксация, которую Git использует в левой части сравнения.

Правая грань - это сам <thing-2>.

Как оказалось, GitHub делает здесь то же самое, поэтому ссылка GitHub имеет три точки: GitHub намеренно имитирует синтаксис git diff.

Другие вопросы по теме