Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Как сделать только один коммит из локальной ветки в remote

Есть удаленный репозиторий
x1->x2->x3 \master
Я сделал его форк и локально новую ветку
/master x1->x2->x3 \y1->y2->y3 \local-develop
Как мне теперь сделать push-request с последним коммитом так, что бы не были видно всей истории коммитов?
/master x1->x2->x3->y3 \y1->y2->y3 \local-develop
Цель в том, что бы добавить результат работы в удаленный репозиторий в отдельную ветку, при этом не захламляя удаленный репозиторий лишними кометами с историей разработки.
Я пробовал сделать так
git checkout local-develop git rebase -i master *squash all commit*
Но получается что они сбиваются в одни в local-develop ветке.
Заранее спасибо.


Ответ

Это так не работает.
Проблема в том, что коммит, семантически, это набор изменений, а не состояние.
Поэтому чтобы отправить последнее состояние, нужно отправить набор изменений от начального (x3, не включительно) до конечного (y3).
И раз вы хотите представить этот набор одним коммитом, то вам придётся сделать один коммит, содержащий в себе изменения y1..y3. С помощью rebase -i вы это и сделали.
Если при этом вы не хотите терять исходные коммиты, можно "сплющивание" (squash) сделать в отдельной ветке (просто перед началом ребейза сделав git checkout -b local-develop-squashed, находясь в ветке local-develop).
После ребейза получится такое состояние:
x1->x2->x3-\ {master} | |->y1->y2->y3 {local-develop} | \->z1 {local-develop-squashed}
В ветке local-develop-squashed по сравнению с master выходит один красивый коммит. Из этой ветки и нужно делать pull request.
У этого, конечно, есть проблемы. Если вы захотите этот pull request доделать, вам придётся делать push --force каждый раз, что в общем случае очень опасно. Поэтому "на посмотреть" можно загрузить и исходную историю из кучи коммитов, и только когда дадут "добро", сделать из кучи коммитов один "прямо на месте" и сделать один раз push --force
А ещё некоторые пользуются при мердже PR опцией --no-ff, а историю смотрят с помощью git log --first-parent master, в результате чего детальная история фича-веток не показывается, а PR выглядят, как отдельные коммиты. И для этого не нужно никакое шаманство с перезаписью коммитов и пушем "силой".

Комментариев нет:

Отправить комментарий