2016-01-06 5 views
0

Предположим, у меня есть несколько фиксаций:мерзавец перебазироваться сквош занимают второе сообщение (например, адресной привязкой)

<sha1> bug due to function1 
<sha2> bug due to function2 
... other commits 

и я хотел бы, чтобы раздавить совершает 1 и 2 вместе, оставив только сообщение о второго совершить, то Я хотел бы использовать git rebase -i, редактировать в:

pick <sha1> bug due to function1 
squash <sha2> bug due to function2 
... other commits 

и всегда нужно будет редактировать объединенные сообщения и удалить первый.

Я знаю, что я мог бы изменить совершающее и использовать fixup вроде этого:

pick <sha2> bug due to function2 
fixup <sha1> bug due to function1 
pick <sha3> other commit 

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

Как я мог достичь такого же результата при меньших манипуляциях, особенно избегая редактирования комбинированного сообщения. Обратите внимание, что может быть много коммитов до фиксации 1 и после фиксации 2.

ответ

1

Сначала сделайте git log, чтобы просмотреть хэши последних четырех коммитов. Возврат к последней фиксации до двух, что вы хотите сквош:

git reset --hard <sha0> 

... где последний коммит до двух, что вы хотите сквош.

Затем попробуйте следующие команды в следующем порядке:

git cherry-pick -n <sha1> 
git cherry-pick -n <sha2> 
git commit 
git cherry-pick <sha3> 

Первые две команды будут объединены <sha1> и <sha2> в локальной промежуточной песочнице. Когда вы делаете git commit без аргументов, он будет совершать изменения, используя сообщение фиксации последнего фиксации. Все, что вам нужно сделать, это выйти из редактора после просмотра сообщения о фиксации. Последний вишневый выбор применяет последний фиксат без изменений.

+0

несколько проблем с этим: коммиты уже находятся в ветке, над которой я работаю; так что это не сработает PLUS Мне нужно заглянуть в историю, чтобы получить два ша ... гораздо больше работы, чем git rebase -i и т. д. Я хочу, чтобы решение было меньше работы ... –

+0

вы " d, очевидно, необходимо выполнить 'git reset --hard ', где sha0 - это хэш перед двумя, которые вы хотите раздавить, прежде чем приступать к выбору вишни. Это точно ответит на ваш вопрос. Если вы запрашиваете способ сделать это только в интерактивном режиме, тогда это должно быть отражено в вопросе. – mkrufky

+0

согласился, что это решение будет работать, если это два последних коммита в дереве. Я адаптировал свой вопрос, чтобы было более ясно, что я хотел бы получить решение, если бы эти коммиты могли быть где-то еще в моей истории. Примените свой ответ так, чтобы он упоминал «решение только в том случае, если это последние две коммиты» или что-то в этом роде; который является частичным решением ... –

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