Ошибка git при коммите после слияния - фатально: не может сделать частичный коммит во время слияния

280

Я побежал, git pullчто закончилось конфликтом. Я решил конфликт, и теперь все в порядке (я также использовал mergetool).

Когда я фиксирую разрешенный файл с, git commit file.php -m "message"я получаю сообщение об ошибке:

fatal: cannot do a partial commit during a merge.

У меня была та же проблема раньше, и использование -aв коммите работало отлично. Я думаю, что это не идеальный способ, потому что я не хочу совершать все изменения. Я хочу зафиксировать файлы отдельно с отдельными комментариями. Как я могу это сделать? Почему git не позволяет пользователям фиксировать файлы отдельно после слияния? Я не смог найти удовлетворительного ответа на эту проблему.

pMan
источник
5
И вы знаете, поиск git execute "full commit" не дает почти ничего полезного. Ни одного соответствующего документа из справочных страниц Git. Это такой жалкий инструмент.
jww
6
@Torek - поговорим о другом беспорядке, созданном Git ... Почему, черт возьми, трудно извлечь конфликтный файл из другой ветви, чтобы предотвратить конфликт, добавить его в эту ветку и затем зафиксировать его ??? А WTF это частичный коммит? Я не могу найти какую - либо документацию на него ... Люди вынуждены попробовать следующие предположения ...
jww
Как ты сделал это? У меня конфликт, и я ничего не могу сделать
Никлас Р.

Ответы:

442

Я обнаружил, что добавление "-i" к команде фиксации решает эту проблему для меня. -I в основном говорит, что нужно подготовить дополнительные файлы перед фиксацией. То есть:

git commit -i myfile.php
MikaelHalen
источник
18
Что Stage additional filesзначит?
jcalfee314
9
@ jcalfee314 в git нужно подготовить файл для коммита. В этом конкретном случае перед фиксацией файл проходит через командную строку. Флаг -i используется в основном для того, когда вы завершаете слияние. Вы можете прочитать больше о флагах коммитов здесь .
MikaelHalen
4
@ jcalfee314 Я проверил документацию и там написано: «Прежде чем делать коммитирование из поэтапного содержимого до настоящего момента, подготовьте также содержимое путей, указанных в командной строке. Обычно это не то, что вам нужно, если вы не завершаете конфликтующее слияние» . Я предполагаю, что при этом условии в зоне подготовки есть некоторая несогласованность, которая не может быть решена git add, что приводит к git commitнеудаче. Добавление -iскажет git добавить и зафиксировать одновременно. Я до сих пор не уверен, почему, но это, кажется, имеет смысл.
JonSlowCN
5
Для таких нубов, как я, вы также получите такую ​​же ошибку, если попробуете сообщение с пробелами без кавычек. Например. [git commit -m один два три] Правильно: [git commit -m "один два три"]
Skychan
2
Комментарий @ Skychan был билетом для меня.
tehbeardedone
106
git commit -am 'Conflicts resolved'

Это сработало для меня. Вы можете попробовать это тоже.

Пратип Гош
источник
1
Удивительно, я этого не знал!
Жан Вальжан
11
Это добавляет все измененные файлы к коммиту , даже те, которые не установлены, что может быть нежелательно. Пользователи могут захотеть убрать флаг «а»
Чейз
4
Это именно то, что пользователь просит не делать, чтобы избежать фиксации всех файлов.
Майкл
33

Вы можете использовать git commit -iдля большинства случаев, но в случае, если это не работает

Тебе нужно сделать git commit -m "your_merge_message". Во время конфликта слияния вы не можете объединить один файл, поэтому вам нужно

  1. Поместить только конфликтный файл ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
источник
16

Возможно, вы столкнулись с конфликтом в чем-то, чего не сделали для фиксации. git не позволит вам фиксировать вещи независимо (потому что это все часть слияния, я думаю), поэтому вам нужен git addэтот файл, а затем git commit -m "Merge conflict resolution". -iФлаг git commitделает надстройку для вас.

Пол Прайс
источник
5
Не в 1.9.0 - commit -iсработало, но нетgit add; git commit
LeeGee
14

Я получил это, когда забыл -mв git commit при разрешении конфликта git merge.

git commit "commit message"

должно быть

git commit -m "commit message"
wgeorge
источник
2
Ах ах! Я снова забыл!
user2705463
9

Как говорится в сообщении об ошибке, вы не можете выполнить частичную фиксацию после слияния. Вместо того, чтобы просто file.phpсовершить, вы должны зафиксировать все изменения.

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

git commit -m "Fixing merge" 
Асим Джалис
источник
Спасибо, это помогло
Нарендра Пандей
Работал на меня как есть
Шашанк Бодхе
6

Ваше слияние остановилось в середине действия. Вы должны добавить свои файлы, а затем «git commit»:

git add file_1.php file_2.php file_3.php git commit

ура

Мойше Зучмир
источник
5

Если вы просто хотите отбросить весь сбор вишни и зафиксировать файлы в любых наборах, которые вы хотите,

git reset --soft <ID-OF-THE-LAST-COMMIT>

доставит вас туда.

То, что делает программный сброс, - это перемещает указатель, указывающий на текущий HEAD, на коммит (ish), который вы дали, но не изменяет файлы. Hard reset переместит указатель и вернет все файлы в состояние в этом коммите (ish). Это означает, что с помощью мягкого сброса вы можете очистить статус слияния, но сохранить изменения в реальных файлах, а затем зафиксировать или сбросить их по отдельности по своему вкусу.

ЦУС
источник
Не могли бы вы объяснить это больше? Это, вероятно, то, что мне нужно, но я не слежу за тем, как это будет работать ... Все ответы здесь просто «добавьте файлы, затем подтвердите!», Но это так тривиально очевидно; причина, по которой я здесь, в том, что я не хочу добавлять эти файлы перед тем, как зафиксировать. -_-;
Кайл Бейкер
Что помогает. Спасибо. :)
Кайл Бейкер
5
  1. перейти в каталог вашего проекта
    1. показать скрытые файлы (появится папка .git)
    2. открыть папку .git
    3. удалить MERGE_HEAD
    4. совершить снова
    5. если git сказал вам, что git заблокирован, вернитесь в папку .git и удалите index.lock
    6. совершить снова все будет хорошо на этот раз.
Ахмед Самир
источник
Большой! Это сработало бы для меня. Кстати, если на MacOS из терминала вы могли бы вызвать `open .git`, ведьма отобразит содержимое .git в Finder
tontonCD
Это работает и для меня. Это должно быть принято как ответ.
Ванду
3

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

Джастин
источник
1
спасибо, но, к сожалению, это не сработало для меня. Досадно, но мне пришлось зафиксировать частное представление, а также слияние, прежде чем оно позволило мне совершить слияние.
Кокси
3

Я решил это с совершенно другим подходом, используя только Source Control Xcode.

Справочная информация: Другая команда отправила изменения в удаленный репозиторий Git (через Beanstalk). С моей стороны, файлы .xcodeproj пришли в другой каталог, и изменения не были приняты. Позже, когда я попытался зафиксировать, я получил ошибку Tree Conflict в Xcode.

Скриншот Дерево конфликта

Поскольку почти невозможно исправить с помощью Xcode, я заменил .xcodeprojфайл загруженной версией с сервера Git. В результате ... проект XCode, казалось, прояснился, однако все обновления от поврежденного Pull показывались как внесенные мной изменения и были подготовлены для коммита.

Посмотрите на все эти Моды и Добавленные файлы

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

Вот как я решил эту проблему ... (Теперь поймите, что я новичок, поэтому мне не хватает понимания ... но мое невежество привело меня к поиску другого способа сделать это.) Сначала я клонировал своего хозяина. Филиал во вторичный филиал и переключился на этот филиал. Затем я создал рабочую копию и поместил каталог в эту рабочую копию за пределами исходного каталога проекта. (Я не знаю, было ли это необходимо, но это то, что я сделал, когда читал другие методы устранения неполадок.) Затем я переключил ветки на мастер, где я понял, что все мои Staged-файлы (изменения в Commit) пропали. Чтобы убедиться, что все файлы были обновлены до последних изменений, внесенных другой стороной, я создал новую ветвь с именем ThirdBranch, которая дублировала все файлы, Выдвинул его на Git-сервер и позволил Beanstalk сравнить мою версию главного сервера для сервера с веткой ThirdBrach, которую я только что нажал (строка за строкой), и все изменения другой стороны присутствовали в моем Xcode. Это означало, что мой главный репозиторий и главный репозиторий Git были одинаковыми, что подтверждает, что я решил проблему только с помощью Xcode.

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

Это повторяющийся ответ на дубликат вопроса по адресу: Неудачный Xcode Git Merge застрял

Plexander
источник
2
Пожалуйста, не публикуйте повторяющиеся ответы. Хотя основная проблема может быть такой же, ваш ответ на гораздо более конкретную проблему и только затуманивает ответы на этот общий вопрос. Я думаю, что в этом случае более уместен комментарий к вопросу, в котором вы ссылаетесь на свой первоначальный ответ.
Fookatchu
2

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

Talljoe
источник
1
Раньше я никогда не использовал rebase или cherry-pick, я просто пробежался по руководству, так что бы вы предложили, «git rebase master» после слияния конфликтов, сработает?
pMan
1
Это параллельный рабочий процесс. См. Stackoverflow.com/questions/804115/git-rebase-vs-git-merge По сути, если вы хотите, чтобы «слияние» было отдельным, коммиты вместо этого перебазируют исходную ветвь в конец целевой ветки.
Talljoe
1
Просто добавьте каждый отдельный файл, затем подтвердите без -a.
Питер ДеВиз
4
Вы на самом деле не ответили на вопрос, а просто дали больше для поиска. Теперь нам нужно знать «что такое сбор вишни» и «что такое перебаз».
ftrotter
2
Интересно, почему этот ответ был отклонен. У меня всегда было любопытство ребенка, когда кто-то рассказывал мне вещи, которых я никогда не знал раньше. Как я прокомментировал выше, теперь я знаю о вишне и подборе. Разве это не было прогрессивным / полезным?
13
2

git commit -i -m 'merge message'не работал для меня Он сказал:

fatal: No paths with --include/--only does not make sense.

FWIW, я попал сюда через этот связанный вопрос, потому что я получил это сообщение:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Я также попробовал Mergetool, который сказал No files need merging. Очень запутанно! Таким образом, MERGE_HEAD находится не в файле, который нужно объединить - ??

Наконец, я использовал этот трюк для добавления только измененных файлов (не хотел добавлять все файлы в моем дереве, так как у меня есть некоторые, которые я хочу оставить без отслеживания):

git ls-files -m | xargs git add

Тогда я наконец (!) Смог совершить и подтолкнуть вверх. Было бы неплохо, если бы git дал вам лучшие советы о том, что делать в таких ситуациях.

szeitlin
источник
1

Если он находится в дереве исходного кода , мы должны явно пометить файл как разрешенный после разрешения конфликтов. Выберите файл, который был только что разрешен без конфликтов. Затем Действия -> Разрешить конфликты -> Отметить решено . Если у вас есть несколько файлов, сделайте то же самое для всех. Сделай сейчас.

CGR
источник
1

После прочтения всех комментариев. это было мое решение:
мне пришлось «добавить» его снова, чем совершить:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
источник
1

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

Luky
источник
0

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

Теперь, если вы выпускаете,

git status Lib/MyFile.php

Вы увидите вывод как

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Так как вы уже поставили коммит, вам нужно просто выпустить

git commit

И ваш коммит будет выполнен без каких-либо проблем.

Кетан Патель
источник