Используйте git merge --squash
(что также заставляет вас использовать git commit
впоследствии).
Описание
В Git коммиты являются историей.Вы не можете добавлять коммиты без добавления истории, потому что это одно и то же.Таким образом, вы хотите сделать одиночный коммит, который будет не коммит слияния, который даст тот же результат, как если бы вы сделали фактический коммит слияния .
Есть несколько способов сделать это, но самый простой - использовать git merge --squash
.Эта команда выполняет то, что я называю «частью глагола», для слияния - чтобы выполнить действие слияния, - вместо того, чтобы сделать коммит слияния , который является прилагательной или существительной частьютипичный git merge
, он делает обычный коммит без слияния.
Точнее, он пропускает финальный коммит, заставляя вас делать это самостоятельно, используя git commit
.Последний коммит, который вы должны сделать сами, это обычный коммит без слияния.Если мы рисуем коммиты так, как мне нравится, мы начинаем с этого:
...--o--o--o <-- mainline
\
o--o--o <-- yourbranch
Если вы делаете обычное ежедневное слияние с помощью git checkout mainline; git merge yourbranch
, результат будет:
...--o--o--o---M <-- mainline
\ /
o--o--o <-- yourbranch
вот почему ваши три коммита теперь добавляются в ветку main-line: commit M
, новое слияние, имеет двух родителей, один из которых является исходным main-line, а другой - вашим собственнымветка.(Ваши три коммита теперь находятся в обеих ветвях.)
Однако, если мы используем git merge --squash
, мы получаем это вместо:
...--o--o--o---S <-- mainline
\
o--o--o <-- yourbranch
содержимое , связанное с новым коммитом S
, является точно таким же , что и содержимое, которое вы получите, сделав коммит M
, но новый коммит S
имеет только одного родителя, поэтому он несвяжите три ваших коммита в ветку main-line.Теперь вы можете удалить свою ветку в будущем.Когда вы делаете это, ваши три коммита становятся невозможными для поиска, и относительно скоро Git фактически полностью их удаляет. 1
Обратите внимание, что ваша ветвь не исчезает сама по себе.Имя yourbranch
здесь поддерживает ваши первые три коммитов.Однако, если вы выполняете больше работы над своей ветвью, это не очень полезно: после того, как вы слили в сквош (и зафиксировали), вы, как правило, должны считать свою ветвь «мертвой» и удалять ее, как только ваш сквош-слияние-коммит S
достаточно солидныйВозможно, вы захотите сохранить его на некоторое время, однако, в случае, если S
окажется плохим, и вы или ваша группа решите вернуть S
: в этом случае вы можете исправить свою собственную ветку, а затем восстановитьсделайте git merge --squash
позже, используя обновленную версию yourbranch
.
1 Обычно, Git старается убедиться, что явно удаленные коммиты остаются как минимуммесяц или около того.Однако, если вы удалите само имя ветви, ветвь reflog , которая является одной из вещей, которая поддерживает коммиты, также исчезнет.Теперь вы полагаетесь на ваш HEAD
reflog.Если вы зафиксировали коммиты в этом хранилище, это также сохранит коммиты в течение месяца или около того, но если нет, то не будет.