Я создал тестовый репозиторий: 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?
Обратите внимание на тройную точку в 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.com/Labutin/CompareBranches/compare/branch_01..branch _03 Ветки не равны.
@dhythhsba Думаю, ты прав. Похоже, Github интерпретирует branch_01..branch_03
как ссылку и по умолчанию устанавливает базу на master
. Вместо того, чтобы выдавать ошибку из-за того, что ссылка не существует, она не сообщает о разнице. Например, github.com/Labutin/CompareBranches/compare/aldkflakjfkjd
Этот вопрос действительно о 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
.
Похоже, GitHub вообще не «делает» двухточечное сравнение.