2013-03-04 6 views
2

Предположим, что я сделал rebase и у 100 файлов были конфликты. Я должен решать их один за другим. Скажем, я разрешил (N-1) файлы, и я работаю над файлом N. После некоторого времени работы над ним я обнаружил, что испортил файл. Поэтому я хочу снова разрешить это с нуля. Но я не хочу отменять rebase и снова выполнять перезагрузку, поскольку я не хочу снова разрешать (N-1) файлы.Возможно ли восстановить конфликт для файла после неудачного его устранения?

Возможно ли восстановить конфликт слияния для файла N, чтобы я мог снова разрешить его с нуля?

+0

Вы используете 'git mergetool' или выполняете разрешение вручную? – asm

+0

Независимо от того, что вы используете, всегда можно испортить файл. Обычно я делаю это вручную. –

ответ

1

Предполагая, что файл, который вы работаете называется test.txt, и что файл был оставлен с маркерами конфликта из-за попытки слияния, и вы каким-то образом провалил делать вручную разрешение этих конфликтов, вы можете повторно -Создайте файл с маркерами конфликтов несколькими командами.

В качестве фона это помогает понять, что когда для слияния требуется ручное разрешение конфликтов в файле, он оставляет три разных копии (называемых «этапами») этого файла в вашем git индексе. Этап 1 является общим предком двух версий файла, который объединяется, а этапы 2 и 3 - это две версии из двух ветвей, которые вы пытаетесь объединить. Некоторые, но не все, утилиты git понимают синтаксис :<stage>:<filename> для ссылки на эти записи.

Итак, что вам нужно сделать первым, чтобы повторно создавать временные копии этих трех файлов где-то - я буду использовать /tmp здесь, но это не является обязательным:

git cat-file -p :1:test.txt > /tmp/test.txt.1 
git cat-file -p :2:test.txt > /tmp/test.txt.2 
git cat-file -p :3:test.txt > /tmp/test.txt.3 

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

mv test.txt test.txt.broken 
git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3 > test.txt 

Это будет заново создать test.txt с маркерами конфликта (хотя без комментариев имени ветви, которые обычно включены - если вы действительно хотите, чтобы эти, вам нужно добавить некоторые -L <branchname> аргументов - вы можете ввести git help merge-file в получите дополнительную информацию об этом).

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

+0

Спасибо за подробный ответ. Если есть N файлов, мне нужно сохранить 3N-файлы. Это слишком дорого. –

+0

Но у меня есть идея, основанная на вашем решении. –

+0

Сделайте это только для файла, который перепутался: git show: 1: test.txt> /tmp/test.txt.1 git show: 2: test.txt> /tmp/test.txt.2 git show: 3: test.txt> /tmp/test.txt.3 git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3> test. txt –

0

Может быть, не так хорошо, решение (выглядит не так git'ish), но вот один из возможных способов:

  1. скопировать (N - 1) файлы в каталог для временных файлов
  2. мерзавец Rebase --abot
  3. копировать (N - 1) файлы назад git dir
  4. работать над вашим N-м файлом.
+0

Требуется O (N).Кажется слишком дорогим :) –

1

Я считаю, что вы ищете git checkout --merge --path/to/file.

+0

№ Git checkout --merge делает слияние трех способов для локальных изменений. Это не то, что я ищу. Благодарю. –

+0

«При проверке путей из индекса эта опция позволяет воссоздать конфликтуемое слияние по указанным путям». – jthill

+0

@ LiboYu - позвольте мне сказать так: вы попробовали? – jthill

 Смежные вопросы

  • Нет связанных вопросов^_^