Как автоматически определить лучший коммит для интерактивного ребазинга?
Я часто использую "fixup!", "Squash!" и "rebase -i", чтобы очистить, исправить или просто поковыряться в недавней неопубликованной истории. Я хотел бы найти способ заставить Git автоматически выбирать, какой коммит наиболее целесообразен для интерактивного перебазирования, чтобы я мог определить псевдоним для быстрого интерактивного перебазирования.
Я думаю, что лучшим коммитом в таких случаях будет самый последний предок:
- появляются в любой другой ветке (локальной или удаленной)
- иметь более одного родителя
- нет родителей
Первое условие гарантирует, что я не переписываю коммиты, которые могут повлиять на других. Второе гарантирует, что я не пытаюсь перебазировать "через" слияние, что, безусловно, не то, что я хочу. Третий - просто проверка работоспособности.
Итак, вопрос в том, как мне использовать Git для поиска этого коммита?
2 ответа
Так что это не красиво, но это то, что я придумал.
#! /bin/sh
commit=$(git rev-parse HEAD)
while [ "$(git log --format="%p" -1 $commit | wc -w)" -eq 1 ] \
&& [ "$(git branch --all --contains $commit | wc -l)" -eq 1 ]
do
commit=$(git rev-parse "$commit^")
done
echo $commit
Я уверен, что есть более простой и надежный способ сделать это, но, похоже, он делает то, что я хочу. Предложения и улучшения приветствуются. (Было бы неплохо сделать это просто с помощью Git-сантехники вместо того, чтобы полагаться на wc
, например.)
Не совсем то, что вы ищете, но звоните git rebase
без указания начальной точки начнется перебазировка в восходящей ветви, что в большинстве случаев является идеальным выбором. Дальнейшее отклонение заставит вас переписать опубликованную историю, что никогда не было хорошей идеей.