Git rebase - продолжает жаловаться, даже когда все конфликты слияния разрешены - PullRequest
82 голосов
/ 15 декабря 2011

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

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

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 add AssetsLoader.java и git status и получил следующее:

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

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

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

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

так что я не уверен, как мне поступить?

Редактировать: Может ли быть так, что файл с разрешенным конфликтом в точности похож на оригинальную версию?

Большое спасибо, Lucas

Редактировать, это просто случилось со мной снова:

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

(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

Ответы [ 7 ]

89 голосов
/ 13 января 2015

Это происходит потому, что при исправлении конфликта вы удалили весь код из исправления, примененного к ветви, на которой вы перебираете.Используйте 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?

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

19 голосов
/ 15 октября 2014

Кажется, это ошибка в Git 1.7

Вот хорошая статья о том, как решить эту проблему .

В основном это должно работать, если вы делаете

git diff

после разрешения ваших конфликтов и затем

git rebase --continue

должно работать.

4 голосов
/ 17 июля 2012

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

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

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

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

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

4 голосов
/ 15 декабря 2011

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

$ git mergetool

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

3 голосов
/ 15 декабря 2011

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

2 голосов
/ 27 января 2015

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

0 голосов
/ 09 июля 2019

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

...