Git rebase --continue жалуется, даже если все конфликты слияния разрешены

115

Я столкнулся с проблемой, которую не знаю, как решить.

Я сделал ребаз против мастера из своей ветки:

git rebase master

и получил следующую ошибку

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

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

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

Я сделал git add AssetsLoader.java и статус git и получил следующее:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

и когда я сделал git rebase --continue, я получил:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

Я знаю, что могу пропустить патч и продолжить перебазирование, но я не уверен, будут ли изменения в PassengerContactHandler.java перенесены в мою ветку или нет.

поэтому я не уверен, что мне делать?

Изменить: может быть, файл с разрешенным конфликтом точно такой же, как и исходная версия?

Большое спасибо Лукас

Изменить, это снова случилось со мной:

Это снова случилось со мной,

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git rebase - продолжить

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1
Лукас
источник
Это полный результат git status, верно? Нет недостающего раздела под ним?
Cascabel
git-rebaseникогда не должен сообщать о неразрешенных конфликтах, если их нет. Если вам удастся воспроизвести проблему в более простом тестовом примере, отладить будет намного проще, но все же, если вы не git statusсообщаете о конфликтах, когда это git rebase --continueпроисходит, и ваша версия Git актуальна, вы можете попробовать отправить электронное письмо разработчику Git. список рассылки на git@vger.kernel.org с максимально возможной диагностической информацией.
Cascabel
1
Это снова случилось со мной, (307ac0d ...) | REBASE) $ git status # Сейчас нет ни в одной ветке. # Изменения, которые необходимо зафиксировать: # (используйте "git reset HEAD <файл> ..." для отключения) # # изменено: assets / world / level1 / Level-1.xml # изменено: George.java # изменено: DefaultPassenger.java # # Не отслеживаемые файлы: # (используйте "git add <file> ...", чтобы включить в то, что будет зафиксировано) # # mb-art / originalAssets / 27dec /
Лукас
Я думаю, вам следует использовать GITKRAKEN, это поможет вам в разрешении ваших конфликтов
Нихил Бхардвадж,

Ответы:

115

Это происходит потому, что при устранении конфликта вы удалили весь код в патче, который был применен к ветке, на которую вы выполняете ребазинг. Используйте, git rebase --skipчтобы продолжить.

Немного подробнее:

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

git add your/conflicted/file
git status

вы получите (обычно зеленую) строку, показывающую измененный файл

изменено: ваш / конфликтующий / файл

git rebase --continue отлично подойдет в этой ситуации.

Иногда, однако, при разрешении конфликта вы удаляете все в своем новом патче, оставляя только код из ветки, которую вы перебазировали. Теперь, когда вы добавите файл, он будет точно таким же, как тот, который вы пытались перебазировать. git status не будет показывать зеленую строку, отображающую измененные файлы. Теперь, если вы это сделаете

git rebase --continue

git будет жаловаться с

Без изменений - вы забыли использовать «git add»?

Что на самом деле git хочет от вас в этой ситуации, так это использовать

git rebase --skip

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

изменено: ваш / конфликтующий / файл

после редактирования конфликтующего файла, его добавления и выполнения git status вы можете быть уверены, что удалили весь патч, и вместо этого можете использовать

git rebase --skip

продолжать.

В исходном сообщении говорилось, что это иногда работает:

git add -A
git rebase --continue
# works magically?

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

jonasfh
источник
1
У меня была такая же проблема и такое же решение, тоже казалось волшебным!
bspink
У меня была такая же проблема, похоже, если вы провели рефакторинг в перебазированной ветке и добавили новые файлы, а затем процесс разрешения слияния внес изменения в эти новые файлы, вам нужно явно git добавить их снова.
Ибрагим
Не делайте этого, если вы не хотите отслеживать все нежелательные файлы в своем репо.
Джед Линч
git add ...становится действительно раздражающим печатать после изменения кучи файлов с длинными путями. git add --all-the-files-i-changedМогу ли я бежать раньше git rebase continue?
jozxyqk 05
3
Будьте осторожны при использовании команды git rebase --skip, вы можете потерять свою работу (отредактированные файлы)
Юнесс Мархрани
8

Я получил это предупреждение, когда у меня были неустановленные файлы. Убедитесь, что у вас нет неустановленных файлов. Если вы не хотите, чтобы неустановленные файлы менялись, отмените изменения с помощью

git rm <filename>  
СкоттиБлейдс
источник
2
Так просто это могло быть комментарием; так полезно, это должен быть ответ. Спасибо!
Лукас Лима
4

Попробуйте запустить это в командной строке:

$ git mergetool

Должен вызвать интерактивный редактор, позволяющий разрешить конфликты. Проще, чем пытаться сделать это вручную, к тому же git распознает, когда вы выполняете слияние. Также позволит избежать ситуаций, когда вы не полностью сливаетесь случайно, что может произойти, если вы попытаетесь сделать это вручную.

Баткинс
источник
Просто подумал, что это может быть проще, а также позволит избежать подобных ситуаций в будущем.
Баткинс
1
Ты спас мой вечер. Хотя это простой инструмент, но я бы никогда не смог понять, как разрешить мои конфликты без этого инструмента.
eonil
4

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

первобытный
источник
Это помогло мне. Я проверил Sourcetree после получения сообщения, описанного в OP, и сразу увидел два файла, упомянутые в командном окне, как неустановленные. Поставил файлы, запустил "git rebase --continue", и я вернулся в нужное русло.
Mass Dot Net
3

Вы пропустили конфликт слияния в AssetsLoader.java. Откройте его и найдите маркеры конфликтов (">>>>", "====", "<<<<<"), а затем снова выполните git add. Выполните git diff --staged, если вам сложно его найти.

Эфир
источник
3
Я сделал grep для всех отслеживаемых файлов, и маркеров конфликтов не было.
Лукас
Есть ли git diff --stagedчто-нибудь полезное? Это указывает на то, какие изменения вы собираетесь зафиксировать, чтобы разрешить конфликт (ы) слияния на данном этапе перебазирования. В одном из файлов должен быть бит «ой, это не то, что я намеревался сделать для устранения этого».
Эфир
4
Git не ищет маркеры конфликта слияния, когда вы пытаетесь двигаться дальше. Он просто проверяет, находится ли индекс в чистом состоянии. Если вы подготовили файл, в котором все еще есть маркеры конфликта, вы указываете, что хотите зафиксировать его вместе с ними. Вероятно, это всегда ошибка, но она позволит вам это сделать.
Cascabel
@ Другое дело вовсе не в этом. Вы можете git addфайл даже с маркерами конфликта в нем. В конце концов, такие файлы могут быть совершенно законными!
fge
@Jefromi: ага, полезно знать! Я всегда предполагал, что маркеры проверены, и нужно было бы пройти мимо них, если бы это было намеренно.
эфир
3

У меня только что была эта проблема, и хотя я думаю, что причин может быть несколько, вот моя ...

У меня был хук git pre-commit, который отклонял коммиты при определенных условиях. Это нормально при фиксации вручную, так как будет отображаться вывод хука, и я могу либо исправить это, либо проигнорировать, используя commit --no-verify.

Проблема, похоже, в том, что при перебазировании rebase --continue также вызовет ловушку (чтобы зафиксировать самый последний набор изменений). Но rebase не будет отображать вывод хуков, он просто увидит, что это не удалось, а затем выплюнет менее конкретную ошибку, говоря: «Вы должны отредактировать все конфликты слияния, а затем пометить их как разрешенные с помощью git add».

Чтобы исправить это, выполните все свои изменения и вместо выполнения «git rebase --continue» попробуйте выполнить «git commit». Если вы страдаете от той же проблемы с крючком, вы должны увидеть причины, по которым он не работает.

Интересно, что хотя git rebase не отображает вывод git hook, он принимает параметр --no-verify для обхода перехватчиков.

карпии
источник
1
У меня была похожая проблема. Больше здесь ничего не работало для меня, но просто выполнение «git commit», а затем прерывание, казалось, волшебным образом разрешило все несоответствия, и тогда я смог успешно выполнить «git rebase --continue».
Патриквачек 06
Просто для записи, поскольку я недавно боролся с подобной проблемой, git rebaseпринимает --no-verifyвариант. Однако он пропускает только pre-rebaseловушку, но эта опция не применяется к последующим вызовам git commit.
pkrysiak
Содержит верную точку (фиксация изменений), но слишком подробный для хорошего ответа.
Джек Миллер
2

После исправления изменений вы можете забыть запустить git add -A

git add -A
git rebase --continue
Gsalgadotoledo
источник
1

Я просто наткнулся на этот вопрос. Я бы не стал, git rebase --skip потому что git statusнаглядно показывать пошаговые модификации, которые я хотел сохранить. Хотя у меня неожиданно были какие-то лишние файлы. Я решил с

git checkout .

удалить немаркированные модификации, то git rebase --continueудалось.

Ghislain
источник