Как обычно это бывает, решил я маленькое изменение закомитить в trunk. Потом еще одно в след, по пути они пересеклись с измениями колег. Тут народ встал дыбом и решил, что последнее изменение нужно переделать. Пока я спал, сделали бранч с последним комитом и откатили его в транке, а первый оставили в транке. Утром я продолжил работу над новой веткой.
Работа закончилась и нужно отправить все клиенту, а у клиента версия X продукта. Понял, что пришло то время, когда необходимо изучить git rebase подробнее. Оказалось все просто и очень вкусно.
Копируем текущую ветку:
git co -b tmp
Запускаем интерактивный rebase на нужную нам версию:
git rebase -i tag-version-X
В редакторе открывается список всех изменений между текущей позицией и версией X. Можно удалить любую строчку и выкинуть измение. В vim и других редакторах, которые могут запускать команды не выходя из редактора, можно посмотреть измения более детально, используя хеш:
:!git show <sha1-hash>
Далее можно использовать format-patch или git diff:
git diff tag-version-X
И отправлять результат. По окончанию удаляем временную ветку:
git br -D tmp