Как исправить сбой git merge-base?

Я хочу иметь возможность запускать эту команду:

git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)

Команда git merge-base дает сбой и ничего не возвращает — ни ошибок, ни чего-то еще. Ветка была создана на основе ветки dev, поэтому между ними существует общий коммит. Как мне выяснить, почему эта команда не работает и как заставить ее работать?

Команда работает на моем локальном компьютере, но не в этой другой среде.

Для устранения неполадок я выполнил следующие команды как на своем локальном компьютере, так и в другой среде:

Мой компьютер:

> git branch
* myBranch
> git show-ref remotes/origin/dev
6f5795fc6932784342adda78e2507a537beb72c3 refs/remotes/origin/dev
> git show-ref -h HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906 HEAD
6f5795fc6932784342adda78e2507a537beb72c3 refs/remotes/origin/HEAD
> git symbolic-ref HEAD
refs/heads/myBranch
> git rev-parse HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906
> git merge-base HEAD remotes/origin/dev
63ed7a1acdb477a37acba3cc1cdec33048adb260
> git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)
myFile.xml

Другая среда:

> git branch
* myBranch
> git show-ref remotes/origin/dev
6f5795fc6932784342adda78e2507a537beb72c3 refs/remotes/origin/dev
> git show-ref -h HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906 HEAD
> git symbolic-ref HEAD
refs/heads/myBranch
> git rev-parse HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906
> git merge-base HEAD remotes/origin/dev
# exit code 1
> git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)
# returns nothing

Что не так в другой среде? Должен ли я клонировать его по-другому? Различные настройки конфигурации git?

Можете ли вы доказать с помощью графического интерфейса, что HEAD и origin/dev имеют общего предка? Потому что я склонен верить Git; экстраординарное утверждение о том, что Git ошибается, требует экстраординарных доказательств.

matt 08.06.2024 04:50

Я согласен.... Я готов поспорить, что проблема в предположениях, а не в git. Возможно, простое объяснение: история одной из ветвей была переписана?

eftshift0 08.06.2024 05:46

@matt Команды отлично работают с теми же ветвями на моем локальном компьютере, но они не работают в контейнере в моем рабочем процессе CI/CD. Я обновил свой вопрос командами и результатами.

jeremywat 08.06.2024 06:20

@eftshift0 это вполне возможно, но я недостаточно знаю git, чтобы понять, в чем именно проблема и как ее исправить.

jeremywat 08.06.2024 06:21
git show-ref не показывает HEAD по умолчанию, вам нужно запросить его с помощью -h / --head. Несколько советов от опытного человека: замедлите проверку, вы недостаточно внимательно проверяете документы и доказательства, когда запутались. Ты показываешь каждый шаг, это хорошо, даже очень хорошо, но ты не проверяешь на каждом шагу, было ли то, что ты увидел, именно тем, что ты ожидал увидеть, и почему ты этого ожидал.
jthill 08.06.2024 06:45

@jthill ок с -h, git show-ref теперь возвращает значение и не выдает ошибку

jeremywat 08.06.2024 06:58

Проверьте историю обеих ветвей вручную (например, с помощью gitk)... вы будете шокированы, обнаружив, что они на самом деле не связаны (то есть с точки зрения коммитов... что и учитывает git при выполнении git merge-base).

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

Ответы 1

Ответ принят как подходящий

Такая проблема может возникнуть, если у вас есть неглубокий клон для начала — и это настройка по умолчанию для многих конвейеров CI/CD (GitHub, gitlab, Azure DevOps...).


Чтобы подтвердить проблему:
проверьте, показывают ли следующие команды git log полную историю ветвей или одна история в какой-то момент обрезана:

git log --graph --oneline myBranch
git log --graph --oneline origin/dev

Чтобы решить проблему:
используйте git fetch --unshallow, например:

git fetch --unshallow origin myBranch

Еще лучше, пожалуй, было бы git log --graph --oneline myBranch origin/dev, т. е. построить график обеих ветвей и посмотреть, встречаются ли они. Именно это я имел в виду под «доказать использование графического интерфейса» в своем первоначальном комментарии.

matt 08.06.2024 20:05

@matt: Я согласен, я просто подумал, что будет легче определить, какой реферал был усечен, проверив две истории отдельно.

LeGEC 08.06.2024 20:08

@LeGEC, спасибо! С помощью git log я смог увидеть, что в ветке origin/dev, по-видимому, не было всей истории, поэтому git fetch --unshallow исправил мою проблему.

jeremywat 10.06.2024 20:02

@jeremywat: проверьте параметры конфигурации вашего конвейера ci, возможно, есть опция «мелкая» или «глубина выборки» или какой-то аналогичный термин, который активирует (или деактивирует) исходный мелкий клон.

LeGEC 10.06.2024 21:17

Да, я удалил опцию глубины, поэтому не следует делать мелкое клонирование, я не знаю, почему это все еще происходит.

jeremywat 10.06.2024 23:44

Да, если подумать, похоже, что глубина по умолчанию равна 1, что, вероятно, и произошло.

jeremywat 10.06.2024 23:46

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