2014-02-21 5 views
0

Я знаком с использованием кабачки очистить мою ветку, но текст для деформируя является use commit, but meld into previous commit, который будет использовать сообщение от предыдущего фиксации. Я интересно, если есть способ сделать это быстро использовать позже совершить (или, вернее, закатать изменения файлов и использовать позже сообщение фиксации в)`Git squash` два коммиты в позже один

Пример:

  • 443f7287: «Исправляет много вещей "(Второй совершить хронологически)
    • файлы A, B, и C
  • 0ebbd9c0:" Частичное обязательство с момента, когда у меня было для переключения треков временно "(первой фиксации хронологически)
    • Файлы D, E и F

Выполнить что-то здесь и в конечном итоге с

  • 443f7287:" Исправляет много вещей "
    • Файлы A, B, C, D, E и F

Я знаю, что я мог бы сделать это с перебазироваться, по давя 443f7287, а затем вручную скопировать его коммит на образовавшемся совершить, но я надеюсь на однострочник без интерактивно-Rebase экранов. Теоретически, я мог бы спрятать свои изменения, когда меняю дорожки вместо того, чтобы их совершать, но я действительно не получал много усилий, пытаясь изучить тайник.

Есть ли способ быстро достичь моих целей? Есть ли лучшее решение?

+1

Я просто делаю это с интерактивным выбором/сквошем; этот вид сквоша сохраняет как сообщения фиксации, так и позволяет редактировать результат. Обычно это кажется проще, чем что-либо еще. – torek

ответ

1

Если эти коммиты находятся на кончике вашего филиала, и вы в настоящее время работаете над изменениями, которые в противном случае были бы в 443f7287, вы можете избежать интерактивной перезагрузки, используя git commit --amend, а не совершать вторую фиксацию вообще. Это предложит вам отредактировать сообщение фиксации предыдущего коммита, после чего вы можете указать сообщение фиксации, которое вы хотите.

Если вы пытаетесь отредактировать фиксации, которые находятся где-то глубже в истории, я не верю, что есть простой способ избежать использования шагов интерактивной переадресации, которые другие разделили.

+0

Разве это не просто изменило бы сообщение, а не очистило бы мою ветку? Состояние моего кода было бы правильным (A-F будет выглядеть так, как я их хочу), но они все равно будут связаны с разными коммитами, когда я действительно хочу одиночную фиксацию, включающую логическую группировку. – ABMagil

+1

Внесение изменений в фиксацию фактически переводит ваши текущие поэтапные изменения в предыдущую фиксацию. Возможно, я был неясен - я приближаюсь к этому, как будто вы еще не совершили 443f7287. Если вы знаете, что эти изменения относятся к предыдущей фиксации, вы можете просто изменить их, а не когда-либо иметь две фиксации. Возможно, это не соответствует вашему сценарию. – joshtkling

+0

А, я вижу. Да, меня особенно беспокоит ситуация, когда я уже совершил оба (хотя я вижу, как мой пример не так хорошо объясняет) – ABMagil

0

Если вы готовы использовать интерактивную перебазироваться, одна вещь, которую вы легко можете сделать, это взять две линии

pick 0ebbd9c0 Partial commit from when I had to switch tracks temporarily 
pick 443f7287 Fixes a lot of stuff 

и изменить порядок их

pick 443f7287 Fixes a lot of stuff 
pick 0ebbd9c0 Partial commit from when I had to switch tracks temporarily 

, а затем изменить вторую к a "fixup":

pick 443f7287 Fixes a lot of stuff 
f 0ebbd9c0 Partial commit from when I had to switch tracks temporarily 

Это будет иметь такой же эффект, как и раздавливание двух вместе, но это будет автоматически берут первое сообщение фиксации («Исправляет множество вещей») без каких-либо дополнительных подсказок.

+2

Обратите внимание, что это зависит от возможности совершать совершения в другом порядке, безопасно. (Это так в примере в вопросе, но не в целом.) – torek

+0

@torek Это важное предостережение, спасибо. – bdesham

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