Git rebase постоянно терпит неудачу и требует ручного вмешательства слияния - PullRequest
7 голосов
/ 01 августа 2009

У меня проблема с перебазированием из мастера в ветку 'deploy' в одном из моих репозиториев.

Мой репозиторий настроен следующим образом:

master - of course, the main branch
deploy - a branch created where files like Capfile, deploy.rb etc are created and configured - these changes will NEVER be merged back into Master

Обычно мой рабочий процесс:

  1. Выполните разработку в основной ветке ... test, smile, commit.
  2. Оформить заказ на deploy ветку
  3. Выполнить git rebase master в ветви развертывания - раньше работало без проблем
  4. Нажмите на пульте и затем выполните cap deploy
  5. Relax

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что при выполнении git rebase master в ветке развертывания возникает ошибка, требующая трехстороннего слияния / ручного слияния (я не думаю, что сообщение об ошибке действительно достаточно универсальное, чтобы сообщение). Git говорит мне выполнить слияние, затем использовать git rebase --continue для завершения - что никогда не работает.

То, что я обнаружил, «работает», работа выполняется git rebase master --interactive, очистка списка выбора (в этом списке 5 или более повторных «подтверждений», но с разными ссылочными номерами (одно и то же сообщение), поэтому я выберу один из них), а затем вручную сделать слияние. Как только я сделаю это для каждого коммита, я смогу продолжить ребаз и все счастливы ...

До следующего раза мне нужно выполнить ребаз.

Так кто-нибудь знает, что может быть счастливым? Проект на самом деле не «секретный», поэтому при необходимости я могу публиковать сообщения, журналы, графики веток и т. Д.

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

Чтобы заставить git rebase --continue работать, вы должны фактически объединить конфликтующие файлы (отредактируйте их, выберите нужные части между маркерами конфликта «<<<<<<<», «======= ”,“ >>>>>>> ”) и затем git add их к индексу (индекс - это место, где они записаны как конфликтующие, при добавлении файла очищается его конфликтующее состояние). Проверьте текущую разницу с git diff --cached, затем git rebase --continue, если она выглядит правильно.

Прежде чем пытаться выполнить перебазирование (или после прерывания проблемного), проверьте git log -p master..deploy, чтобы просмотреть коммиты, которые вы пытаетесь перебазировать. Это один из них, который конфликтует с тем, что у вас есть в master .

Те коммиты, которые вы удаляете, удаляя их строки "pick" в git rebase -i, могут не совпадать (даже если они имеют одинаковый "субъект" в своем сообщении о коммите). Тот факт, что вы думаете, что должен быть только один из них, указывает на то, что с вашей веткой deploy происходит что-то подозрительное. Являются ли эти «дублирующие» коммиты на кончике deploy или после них есть другие коммиты? Возможно, просмотр содержания этих «подозрительных» коммитов (log -p выше) даст вам подсказку об их источнике.

1 голос
/ 15 июня 2011

Звучит так, как будто это может произойти, это то, что вы изменили историю коммитов этих «повторных» коммитов, так что они имеют другой sha1. Каждый sha1 уникален не только для фиксации, но и для истории фиксации. Следовательно, невозможно (ну, очень маловероятно, чтобы это произошло в течение жизни вселенной), иметь два идентичных sha1 в одной истории или даже два sha1 в двух разных историях. Если вы измените что-либо в своем коммите, например, с помощью изменения или интерактивной перебазировки, вы измените sha1. Таким образом, два коммита, которые могут выглядеть одинаково, на самом деле обрабатываются по-разному.

Скорее всего, вы перебазировали из другой ветки, сделали какой-то тип интерактивной перебазировки или внесли изменения в коммиты, продолжили фиксировать еще немного кода, который изменил ту же часть кода, а затем при следующей перебазировке возникнут конфликты, потому что Коммиты, которые у вас есть в вашей локальной ветке, которые отличаются от ветки, из которой вы перебираете, удаляются из ветви, апстрим включается, включая тот коммит, который вы уже вытащили, и изменил sha1, а затем, когда коммиты воспроизводятся в ветке вы столкнетесь с конфликтом, потому что состояние кода изменилось по сравнению с тем, что ожидалось, потому что он изначально был создан из другой истории, чем то, что вы сейчас имеете в своей ветке. Вау, это было длинное предложение ...

Когда вы «очищаете» список выбора ... то, что вы делаете, скорее всего, удаляет эти повторные коммиты перед перебазированием, так что теперь вы не применяете изменения, которые уже были применены, поэтому больше нет конфликтов.

Однако, если вы просто хотите разрешить конфликты во время перебазирования, это, вероятно, будет лучшим выбором, чтобы вы случайно не удалили коммит, который хотите. Разрешение конфликтов сделает набор изменений этого коммита отличным, применимым к вашей истории. После того как вы нажмете это разрешение конфликта слияния, вы больше не увидите проблем, если не измените коммиты, которые уже были переданы снова.

Чтобы найти, какие файлы имеют конфликты слияния, выполните:

git status

или

git ls-files -u

Как только вы знаете, какие файлы имеют конфликты, если у вас есть настройка mergetool, вы можете сделать:

git mergetool <file>

Если вы предпочитаете выполнять слияние вручную, вы можете найти маркеры слияния и строки, выполнив:

grep -Hnr '^=\{7\}\|^<\{7\}\|^>\{7\}' *

на верхнем уровне вашего пути репо и редактируйте. Когда вы редактируете вручную, убедитесь, что вы удалили маркеры и сделали так, чтобы окончательная версия файла выглядела так, как вы хотите ... git не делает ничего особенного с маркерами для вас. Когда вы закончите редактирование вручную, обязательно наберите

git add <file>

чтобы добавить файл, добавить его в индекс и убрать необъединенный флаг. Когда вы закончите разрешать все неотправленные файлы, выполните

git rebase --continue

Для завершения перебазирования.

1 голос
/ 01 августа 2009

Вы можете определить атрибут в родительском каталоге ваших файлов "для развертывания", чтобы всегда выбирать содержимое ветви развертывания в случае слияния.

Пример менеджера слияний см. В этом SO-ответе .

Обсуждались другие стратегии , но ключ остается: всегда рассматривайте слияние как "слияние всего проекта", а не слияние на основе файлов. Отсюда атрибуты для уточнения этого слияния по всему проекту, когда дело доходит до некоторых «специальных» файлов.

...