Git squash все коммиты в ветке без конфликтов

Обычный рабочий процесс разработки для нас - это проверить ветку b, зафиксировать в ней группу, а затем объединить все эти коммиты в одну (все еще на b).

Однако во время rebase -i процесса раздавливания всех коммитов часто возникают конфликты на нескольких этапах.

По сути, я хочу преобразовать ветвь в одну фиксацию, которая представляет состояние репозитория на момент последней фиксации b

Я поискал, но не нашел именно того, что ищу. Я не хочу merge --squash, потому что мы хотели бы протестировать сжатую функциональную ветвь перед объединением.


person Andy Ray    schedule 27.06.2013    source источник
comment
Исходя из этого вопроса - я не хочу, чтобы G находился в stable, я хочу, чтобы он по-прежнему находился в ветке функций. Не уверен, что я что-то упускаю   -  person Andy Ray    schedule 28.06.2013
comment
Не могли бы вы тогда просто сорвать вишню G?   -  person Micha Wiedenmann    schedule 28.06.2013
comment
Вишня ковыряет на какой ветке? Я хотел бы сохранить то же имя ветки   -  person Andy Ray    schedule 28.06.2013
comment
Почему бывают конфликты при раздавливании? Для меня это не имеет смысла ...   -  person Ajedi32    schedule 26.08.2014


Ответы (3)


Если вам не нужна информация о фиксации, вы можете просто выполнить программный сброс. Затем файлы останутся такими, какими они были, и когда вы сделаете коммит, этот коммит будет поверх коммита, на который вы сбросили.

Чтобы найти фиксацию для сброса:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM

потом

git reset --soft COMMIT_HASH

Затем переделайте коммит, возможно:

git commit -am 'This is the new re-created one commit'
person Rasmus Østergaard Kjær Voss    schedule 27.06.2013
comment
Вау, большое спасибо за это. Не могли бы вы объяснить, почему это не работает, если вы просто выполняете сброс (без --soft)? - person timetowonder; 23.03.2020

Это похоже на ответ Расмуса, но разбит на три шага, которые всегда должны работать:

$ git merge feature1
$ git reset --soft HEAD@{1}
$ git commit -c feature1

Объяснение:

  1. объединять и разрешать конфликты
  2. сохранить изменения поэтапно, но сбросить на старую голову
  3. зафиксировать все изменения, используя сообщение фиксации и автора из последней фиксации ветки функций
person ColinM    schedule 28.01.2014

Специально для этой задачи я создал инструмент:

https://github.com/sheerun/git-squash

Например, вы можете вызвать следующее, чтобы сжать все коммиты от «основного» коммита до HEAD, независимо от того, сколько конфликтов будет на этом пути:

git squash master

По сути, это то, что делает GitHub, когда вы «сжимаете и объединяете» пул-реквест.

person sheerun    schedule 01.06.2020
comment
Это действительно то, что я искал. Спасибо. - person Deepak; 20.08.2020