Подтвердить что ты не робот

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

У меня возникла проблема с тем, что я не уверен, как ее решить.

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

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.

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

 # 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 добавить 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

Я знаю, что могу пропустить патч и продолжить rebase, но я не уверен, что изменения в 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 -continue

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

git --version

git version 1.7.1
4b9b3361

Ответ 1

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

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

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

git add your/conflicted/file
git status

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

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

git rebase -continue будет работать нормально в этой ситуации.

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

git rebase --continue

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

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

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

git rebase --skip

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

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

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

git rebase --skip

продолжить.

В оригинальном посте сказано, что это иногда работает:

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

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

Ответ 3

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

$ git mergetool

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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