LINUX.ORG.RU

Как объединить все коммиты в одной ветке?

 


0

1

Есть feature ветка, в которой 100500 коммитов, при этом она развивается параллельно с master. Хочу сделать git rebase -i для всех коммитов в этой ветке.

Задача вроде простая, но ничего толкового/рабочего нагуглить не смог.

PS: я знаю про merge --squash, это не оно.

★★★★★
Ответ на: комментарий от i-rinat

Там у меня коммиты вперемешку. И я хочу сразу для всех в ветке.

Потыкал в тестовой копии - какая-то ерунда получась.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Это понятно, но у меня эта ветка уже оформлена как pull request на гитхабе. Пересоздавать - не вариант.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Ничего не понимаю: ты комитишь свои патчи в какойт-то форк, и теперь решил все свои патчи одним махом закомитить в мейн?

anonymous
()
Ответ на: комментарий от RazrFalcon

Всмысле испортит? Как? Само?

Опиши задачу по другому, уже пару человек в треде не поняли, включая меня.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я в ОП уже расписал.

Есть две ветки: master и feature. Они развиваются параллельно. Я хочу превратить все коммиты в feature в один.

Всё что я пробовал, начинало ломать мастер или приводило к тонне конфликтов.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Все подряд в ветке до указанного коммита

anonymous
()
Ответ на: комментарий от RazrFalcon

А, дошло. git rebase -i HEAD~100500(тут количество коммитов именно которые нужно сквашнуть, не те что есть в мастере.)

Потом в редакторе делаешь обычный squash, делаешь MR в мастер и магия.

Либо надо отпулить свежий мастер, над ним сделать ветку и в неё залить свои изменения а потом уже сквашнуть.

Deleted
()
Ответ на: комментарий от Deleted

git rebase -i HEAD~100500

Оно содержит коммиты из master.

делаешь MR в мастер и магия

Мне не нужно делать merge в мастер.

Либо надо отпулить свежий мастер

Я не хочу удалять текущую ветку.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Я не хочу удалять текущую ветку.

никто не говорит удалять, можно сбоку сделать, и по рукам не дадут

Deleted
()
Ответ на: комментарий от dhampire

Не проще ли (и быстрее) git diff + patch/git-apply?

anonymous
()
Ответ на: комментарий от dhampire

Оно предлагает исправлять конфликты для каждого коммита. Это пол дня займёт.

RazrFalcon ★★★★★
() автор топика

ЯННП, что ты хочешь куда объединить.

git checkout feature
git reset --soft $(git merge-base feature master)
git checkout -b feature-squashed
git commit -m 'all commits since feature and master merge-base, squashed'
git rebase master feature-squashed

Так?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Не пойму

Вот и я не пойму, что ты хочешь получить.

intelfx ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну так причёсывай посредством squash. Да хоть полностью все коммиты переделай. Если это приведёт к упорядочиванию и простоте просмотра по каждой фиче, то это, обычно, только приветствуется.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Разве это не merge –squash?

И да, и нет. Все команды, кроме последней, делают в точности то что ты хочешь. А дальше с этим коммитом можно делать что угодно, напр. отребейзить на текущий master (и тогда это будет почти эквивалентно merge --squash).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

И у тебя в твоём feature branch коммиты, конфликтующие с master? Тогда вынужден огорчить, в git ИИ ещё не завезли, что бы отребейзить/сквошнуть с автоматическим разрешением конфликтов. Я обычно такие долгострои сквошу в несколько этапов. Для удобства открываю окно gitk со сквашиваемой веткой. Затем в другой консоли делаю git rebase -i нужное_место. Далее перегруппировываю, и сквошу группами компонентов, так что бы они не конфликтовали. Если история длинная, то делаю ребейз в несколько этапов (создаю ветку на промежуточном коммите и сначала делаю rebase -i до него, а в следующий этап - до целевого коммита). Как правило один из получившихся после группировки коммитов идёт в мастер, какие-то в ветку на будущие мержи, что-то в 'dev' ветку для того, что бы потом можно было замержиться с ней и поотлаживаться.

Перед всей процедурой ставлю ветку 'feature-unsquashed', что бы потом можно было начать сначала :)

allter149
()

+1 предыдущему оратору.

Намедни, полдня именно так сквошил из дев ветки в мастер через временную ветку. Долго и нудно.

necromant ★★
()

Хочу сделать git rebase -i для всех коммитов в этой ветке.

git checkout feature_branch
git rebase -i master

Получится интерактивный ребейз feature_branch на master. Об этом вопрос?

annulen ★★★★★
()
Ответ на: комментарий от annulen

Да. Но как оказалось оно требует исправлять конфликты. А у меня там штук 50 коммитов. Я пол дня мучатся буду.

Пока забил.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Но как оказалось оно требует исправлять конфликты.

Конечно, как и любой rebase. Если конфликты распределены по патчам, то эффективнее сделать merge

annulen ★★★★★
()
Ответ на: комментарий от annulen

Конечно, как и любой rebase.

Если были последовательные коммиты в одну ветку - но всё будет ок.

RazrFalcon ★★★★★
() автор топика

Тебе нужен squash

Гугли gir rebase squash

deterok ★★★★★
()

git reset master сплющит коммиты на ветке до ее корня (master), не?

conalex ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.