2012-06-25 3 views
4

Я попал в ситуацию, которая кажется довольно необычной, и по существу хочу разделить мое рабочее состояние на две сделки. Один из них является слиянием, а другой - существенным.Git: Отменить локальные изменения с момента неудачного слияния

Вот что пошло вниз:

  1. Я спас мое рабочее состояние с git stash
  2. git rebase master
  3. Смотрите некоторые слияния конфликтов, исправить их
  4. git stash pop
  5. Работы на некоторое время на файлы с конфликтами

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

Цель

Один обязательство разрешать конфликты слияния, и один коммят мои локальные изменения. Как я могу разделить текущее (конфликтное) состояние на эти два коммита?

+0

В чем вопрос? –

+0

@Michael Обновлен, чтобы задать более четкий вопрос. – Wylie

ответ

1

Я нашел свое собственное решение, которое сработало, потому что мои изменения были отдельными кусками в diff. Вот что я сделал:

  1. git add всех неслитые файлы, которые принесли мое рабочее дерево в работоспособное состояние
  2. git reset чтобы убрать из буфера этих файлов
  3. выбрать конкретные куски совершить с git add --patch

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

1

Сверху моей головы и не имея репо в аналогичном состоянии для игры, лучший вариант - это, вероятно, git stash текущее состояние (слияние продолжается и новая работа), затем git reset назад до слияния , Повторите слияние и не забудьте зафиксировать. Затем git stash pop, но вы, вероятно, столкнетесь с инверсией конфликтов слияния, чтобы разобраться, когда вы это сделаете.

Если вы не можете специально разобрать куски, полученные из слияния, а также дополнительную работу через git add -i et. и др., или если либо слияние, либо дополнительные работы достаточно незначительны, чтобы бросить и начать все сначала ...

+0

Спасибо за предложение. К сожалению, «git stash» на самом деле не удается из-за неразрешенных конфликтов. Считаете ли вы важным, добавляете ли я файлы перед тем, как скрыть? – Wylie

+0

@Wylie Это может позволить 'git stash' преуспеть.В качестве альтернативы вы можете отправить результаты слияния только на эти файлы (если только некоторые из ваших дополнительных работ не находятся в одних и тех же файлах) с 'git reset', поэтому они не отображаются в процессе слияния. – twalberg

1

Вы можете сделать git rebase --abort (так как вы делаете Rebase), git stash снова, а затем пытается git rebase снова и разрешение конфликтов с git mergetool. Когда закончите с конфликтами, git rebase --continue.

+0

В документации для 'git rebase -abort' я вижу, что он попытается восстановить состояние до того, что было до фиксации. Как это повлияет на мои изменения с тех пор? – Wylie

+0

Ох. Это сложнее, чем я думал. Попробуйте 'git stash' перед тем, как сделать' git rebase -abort'. – YuriAlbuquerque

+0

'git stash' не удается из-за конфликтов слияния, что, по-видимому, является ограничением инструмента – Wylie

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