2012-02-14 4 views
2

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

<<<<<<< HEAD 
======= 

>>>>>>> ... commit message 

что, естественно, приводит к ошибке PHP. Я могу исправить файл достаточно легко, но я не хочу добавлять ошибочную фиксацию «fix sloppy rebase».

Как я могу изменить это изменение на rebase? Или повторите перебазу, чтобы я мог ее поймать?

ответ

4

Этот вопрос в основном сводится к «как изменить коммит, который не является последним?». Предполагая, что вы нигде не подталкивали фиксацию, и, полагая, что история является линейной от этой фиксации, она довольно проста.

  1. Внесите изменения, которые вы хотите применить к своей более ранней фиксации.
  2. Выясните, что было сделано ранее, когда вы хотите изменить. Ради этих инструкций мы назовем это $SHA, но вы можете использовать любые средства, которые вы хотите идентифицировать.
  3. Пробег git commit --fixup $SHA.
  4. Run git rebase -i --autosquash $SHA^

Это даст вам редактор со списком фиксаций. Первая фиксация должна быть $SHA, вторая должна быть вашей правкой, а следующая за ней должна быть остальная сумма до HEAD. Сохраните и закройте этот редактор. Теперь Git сделает интерактивную перезагрузку, применив ваше изменение к фиксации, которую вы хотите изменить.

Есть альтернативное решение, которое вы можете использовать, которое немного более ручное, но работает без интерактивной переустановки. В принципе, вы можете проверить фиксацию, которую хотите изменить напрямую (создавая отдельную голову), внести изменения, запустите git commit --amend, а затем перетащите ветку поверх новой измененной фиксации. Вы можете предпочесть этот стиль, поскольку он немного более ясен в отношении того, что вы делаете, но преимущество интерактивной версии rebase заключается в том, что вы можете делать гораздо больше вещей с помощью интерактивной rebase. Например, вы можете переупорядочить коммиты, сквонировать несколько коммитов вместе, удалять коммиты, комментировать заново и т. Д. Вы также можете использовать флагов и --squash для git commit, чтобы записывать эти действия, которые вы хотите выполнить, не выполняя сразу же переадресацию, а затем вы можете вернуться и сделать одну большую интерактивную переустановку, когда закончите.

+0

Будет ли коммит, который я хочу изменить, первым фиксатором ветки? Ошибочные строки отображаются в разнице между этим фиксатором и последним от мастера, просто переустанавливаются. – Umbrella

+0

, пожалуйста, объясните, «затем переустановите ветку поверх новой измененной фиксации». Я не понимаю, должен ли я запускать 'git rebase [branch]' в то время как в отдельной голове, или 'git rebase [commit]' after. – Umbrella

+0

@ Зонт: любой фиксатор вводит строки, которые вы хотите изменить, та, которую вы хотите настроить. Похоже, что это первая фиксация из вашей ветки. Что касается объяснения, когда вы находитесь на своей отдельной голове, после внесения изменений в коммит, вы можете использовать 'git rebase HEAD [branch]' (который проверяет ветвь и переустанавливает ее поверх того, что было 'HEAD', т.е. измененная фиксация). –

0

Вы можете внести изменения, а затем git commit --amend.

+0

Выполнение этого результата приводит к удалению этих строк, отображаемых в последнем фиксации. Это отличается от исправления rebase. – Umbrella

+0

Кстати, мне теперь также нужно знать, как очистить это. – Umbrella

+0

Я вижу. Была ли остальная часть ребазы успешной? Если это так, вы должны иметь возможность «git reset --hard [ref of commit непосредственно перед неудачным слиянием]», а затем снова переустанавливать. Если вы не возражаете, чтобы спросить, в чем дело с мягко неряшливой фиксацией? – Brandan