Помилка Git під час фіксації після злиття - фатальна: не може зробити часткове фіксацію під час злиття


280

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

Коли я фіксую вирішений файл, git commit file.php -m "message"я отримую помилку:

fatal: cannot do a partial commit during a merge.

У мене був той самий випадок раніше, і використання -aв комітеті працювало чудово. Я думаю, що це не ідеальний спосіб, тому що я не хочу вносити всі зміни. Я хочу ввести файли окремо з окремими коментарями. Як я можу це зробити? Чому git не дозволяє користувачам збирати файли окремо після об'єднання? Я не зміг знайти задовільної відповіді на цю проблему.


5
І ви знаєте, пошук git виконувати "повну фіксацію" не повертає майже нічого корисного. Не один відповідний документ зі сторінок людини Git. Це такий жалюгідний інструмент.
jww

6
@Torek - поговоріть про інший безлад, створений Git ... Чому так чортово важко перевірити конфліктний файл з іншої гілки, щоб конфлікт був відвернутий, додайте його до цієї гілки, а потім виконайте це ??? І WTF - це частковий комітет? Я не можу знайти жодної документації на нього ... Користувачі змушені спробувати здогадки нижче ...
jww

Як ти це зробив? У мене конфлікт, і я нічого не можу зробити
Ніклас Р.

Відповіді:


442

Я виявив, що додавання "-i" до команди команд вирішує цю проблему для мене. По суті, -i вказує на його подачу додаткових файлів до введення. Це є:

git commit -i myfile.php

18
Що Stage additional filesозначає?
jcalfee314

9
@ jcalfee314 інсценування в git - це підготовка файлу до фіксації. У цьому конкретному випадку він здійснює поетапність файлу через командний рядок перед введенням. Прапор -i використовується в основному, коли ви укладаєте злиття. Ви можете прочитати більше про прапори фіксування тут .
MikaelHalen

4
@ jcalfee314 Я перевірив документацію, і в ній написано: "Перш ніж робити фіксацію з поетапного вмісту до цих пір, також сформулюйте вміст шляхів, вказаних у командному рядку. Це, як правило, не те, що потрібно, якщо ви не укладаєте конфліктне злиття" . Я здогадуюсь, що за цієї умови в області постановки є якась непослідовність, яку неможливо вирішити git add, що робить git commitневдалою. Додавання -iдозволить git додавати та виконувати одночасно. Я досі не впевнений, чому, але, здається, це має сенс.
JonSlowCN

5
Для ноубів, як я, ви також отримаєте цю саму помилку, якщо спробуєте повідомлення, що включає пробіли без лапок. Напр. [git commit -m one two three] Правильно: [git commit -m "one two three"]
Skychan

2
@ Коментар Skychan був для мене квитком.
tehbeardedone

106
git commit -am 'Conflicts resolved'

Це працювало для мене. Ви можете спробувати і це.


1
Дивно, я цього не знав!
JeanValjean

11
Це додає всі модифіковані файли до коміту , навіть ті, що не встановлені, що може бути небажаним. Користувачі можуть захотіти зняти прапор 'a'
Чейз Сандманн

4
Це саме те, що користувач просить не робити, а це уникати вчинення всіх файлів.
Майкл

33

Ви можете використовувати його git commit -iв більшості випадків, але якщо це не працює

Вам потрібно зробити git commit -m "your_merge_message". Під час конфлікту злиття ви не можете об'єднати один файл, тому вам потрібно

  1. Поставити лише конфліктований файл ( git add your_file.txt)
  2. git commit -m "your_merge_message"

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-зобов'язанні, коли вирішував конфлікт злиття git.

git commit "commit message"

має бути

git commit -m "commit message"

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), яку ви дали, але не змінює файли. Жорсткий скидання перемістив би вказівник, а також поверне всі файли до стану в цьому комісі (ish). Це означає, що за допомогою м'якого скидання ви можете очистити стан злиття, але зберегти зміни у фактичних файлах, а потім зробити їх чи скинути кожен окремо на свій смак.


Чи можете ви пояснити це більше? Це, мабуть, те, що мені потрібно, але я не стежу за тим, як би це працювало ... Усі відповіді тут просто "додайте файли, потім виконайте фіксацію!", Але це так тривіально очевидно; тому що я тут - я не хочу додавати ці файли до того, як я зроблю їх. -_-;
Кайл Бейкер

Це допомагає. Дякую. :)
Кайл Бейкер

5
  1. перейдіть до каталогу проектів
    1. відображення прихованих файлів (з'явиться папка .git)
    2. відкрити папку .git
    3. видалити MERGE_HEAD
    4. знову здійснити
    5. якщо git сказав вам, що git заблокований, поверніться до папки .git та видаліть index.lock
    6. знову покладись, на цей раз все буде добре.

Чудово! Це могло б працювати для мене. До речі, якщо на MacOS з терміналу ви могли б викликати `відкрити .git`, відьма відобразить вміст '.git' у Finder
tontonCD

Це працює і для мене. Це слід сприймати як відповідь.
vandu

3

Для себе це сталося в SourceTree, коли я намагався здійснити злиття, перш ніж вирішити всі файли. Потім я позначив останнє рішення вирішеним, і все ж він все ще дав мені цю помилку при спробі вчинити. Я закрив SourceTree і знову відкрив його, а потім він здійснив штраф.


1
дякую, але, на жаль, це не спрацювало для мене. Прикро, мені довелося здійснити перегляд приватного, а також злиття, перш ніж це дозволить мені здійснити злиття.
Coxy

3

Я вирішив це зовсім іншим підходом, використовуючи лише управління кодом Xcode.

Передумови: Інша команда Pushed зміни у віддалений сховище Git (через Beanstalk). На моєму кінці файли .xcodeproj потрапили під інший каталог, і зміни не відбулися. Пізніше, коли я намагався здійснити, я отримав помилку Tree Conflict у Xcode.

Скріншот дерева конфлікту

Будучи майже неможливо виправити за допомогою Xcode, я замінив .xcodeprojфайл завантаженою версією з сервера Git. Результат ... Проект Xcode виявився ясним, проте всі оновлення корумпованого Pull відображалися як зміни, які я вніс, і ставились на виконання комісії.

Подивіться на всі ці модні та додані файли

Однак, намагаючись взяти на себе зобов’язання, я отримав ту саму помилку "фатально: не можна зробити часткову фіксацію під час злиття", про яку йдеться тут.

Ось як я вирішив проблему ... (Тепер зрозумійте, що я програвач-новачок, тому мені не вистачало розуміння ... але моє незнання змусило мене знайти інший спосіб зробити це.) По-перше, я клонував свого господаря Відділіться на вторинну гілку і переключився на цю гілку. Потім я створив Робочу копію і розмістив каталог у цій робочій копії поза оригінальним каталогом проекту. (Я не знаю, чи це було необхідно, але це було, що я робив, читаючи інші методи усунення несправностей.) Потім я перейшов гілки до майстра, де я зрозумів, що всі мої поетапні файли (зміни до Комітету) вже не було. Щоб переконатися, що всі файли були оновлені до останніх змін, внесених іншою стороною, я створив нову гілку під назвою ThirdBranch, яка копіювала всі файли, Натиснув його на сервер Git і дозволив Beanstalk порівняти мою версію сервера головного відділення з гілкою ThirdBrach, яку я просто натиснув (рядок за рядком), і всі зміни іншої сторони були присутніми на моєму Xcode. Це означало, що моє основне сховище та головне сховище Git були однаковими, що підтверджує, що я вирішив проблему лише за допомогою Xcode.

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

Це дублююча відповідь на повторне запитання як за адресою: Не вдалося з’єднати Xcode Git Merge


2
Будь ласка, не публікуйте повторюваних відповідей. Хоча основна проблема може бути однаковою, ваша відповідь стосується набагато конкретнішої проблеми і лише затуманює відповіді на це загальне питання. Я думаю, що в цьому випадку коментар до питання, в якому ви посилаєтесь на свою оригінальну відповідь, є більш підходящим.
Fookatchu

2

Під час злиття Git хоче відслідковувати материнські гілки з усіляких причин. Що ви хочете зробити, це не злиття, як це бачить git. Ви, швидше за все, захочете зробити ребазування або вишню вручну.


1
Раніше я ніколи не використовував ребазу чи вишневий вибір, я просто переглянув посібник зараз, і що б ви запропонували, "майстер ребатів git" після злиття конфліктів спрацює?
pMan

1
Це паралельний робочий процес. Дивіться stackoverflow.com/questions/804115/git-rebase-vs-git-merge В основному, якщо ви хочете, щоб "злиття" було окремим, ви зобов'язані замість цього перезавантажити вихідну гілку на кінець цільової гілки.
Talljoe

1
Просто git додайте кожен окремий файл, а потім виконайте без -a.
Peter DeWeese

4
ви насправді не відповіли на запитання, а просто дали більше на пошуки. Тепер нам потрібно знати, що таке збирання вишні та що таке відновлення.
ftrotter

2
Цікаво, чому ця відповідь була заперечена. У мене завжди була цікавість дитини, коли хтось розповідає мені речі, про які я ніколи не знав. Як я коментував вище, тепер я знаю про вишню та реставрацію. Хіба це не було прогресивним / корисним?
pMan

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 дав кращі підказки, що робити в цих ситуаціях.


1

Якщо він знаходиться в Джерело дерева , ми повинні чітко позначити файл як вирішений після вирішення конфліктів. Виберіть файл, який щойно вирішено без конфліктів. Потім дії -> Вирішити конфлікти -> Позначити вирішеними . Якщо у вас кілька файлів, зробіть те саме для всіх. Зробіть зараз.


1

Прочитавши всі коментарі. це була моя резолюція:
мені довелося "додати" її ще раз, ніж виконувати:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html

1

Якщо ви використовуєте вихідне дерево або інший графічний інтерфейс, переконайтеся, що всі файли перевірені (після об'єднання).


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

І ваше зобов’язання буде виконано без жодних питань.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.