Как автоматически определить лучший коммит для интерактивного ребазинга?

Я часто использую "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 без указания начальной точки начнется перебазировка в восходящей ветви, что в большинстве случаев является идеальным выбором. Дальнейшее отклонение заставит вас переписать опубликованную историю, что никогда не было хорошей идеей.

Другие вопросы по тегам