Страницы

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

вторник, 10 декабря 2019 г.

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

#git #git_rebase


Есть удаленный репозиторий

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 ветке.

Заранее спасибо.
    


Ответы

Ответ 1



Это так не работает. Проблема в том, что коммит, семантически, это набор изменений, а не состояние. Поэтому чтобы отправить последнее состояние, нужно отправить набор изменений от начального (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 выглядят, как отдельные коммиты. И для этого не нужно никакое шаманство с перезаписью коммитов и пушем "силой".

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

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