Пара вариантов для вас:
Ограничить ведение журнала
Не совсем то, что вы просили, но, возможно, хорошая альтернатива и намного проще. Это позволяет вам использовать git как обычно, но скрывает все, что вы не хотите видеть (при условии, что проблема заключается в том, что история загромождает ваш журнал, а не в необработанном пространстве для хранения. Я думаю, что сжатие слияния в вашей ветке не будет предотвратить включение в git всех коммитов из восходящего потока, если вы в первую очередь извлекли восходящий поток для действия слияния.).
В этом случае вы бы сделали обычное слияние, но при регистрации добавили бы --first-parent
к команде.
Например, без опции, которую я мог бы иметь (предположим, что «больше образцов» от 1 до 3 на самом деле было намного больше коммитов)
$ git log --oneline
0e151bf Merge remote-tracking branch 'origin/master' into nosquash
f578cbb sample more 3
7bc88cf sample more 2
682b412 sample more 1
fc6e1b3 Merge remote-tracking branch 'origin/master'
29ed293 More stuff
9577f30 my local change
018cb03 Another commit
a5166b1 Initial
Но, если я добавлю --first-parent
, это приведет к следующему:
$ git log --oneline --first-parent
0e151bf Merge remote-tracking branch 'origin/master'
fc6e1b3 Merge remote-tracking branch 'origin/master'
9577f30 my local change
018cb03 Another commit
a5166b1 Initial
Обратите внимание, что все коммиты от мастера после того, как я разветвился («мое локальное изменение» является моей расходящейся фиксацией), исчезли. Отображаются только те коммиты, которые я сделал, в том числе при слиянии. Если бы я использовал более качественные сообщения коммитов во время слияния, я мог бы даже знать, что это была за партия изменений.
Заменить историю
Это для того, что вы спросили.
Черпая вдохновение из https://git-scm.com/book/en/v2/Git-Tools-Replace
Что мы будем делать здесь, так это сжимать историю удаленного устройства, заменять его историю нашей сжатой версией с нашей точки зрения и объединять сжатую версию.
В моем примере репозитория ревизии, добавленные восходящим потоком, которые я еще не объединил, были 682b412 "sample more 1" to origin/master (f578cbb "sample more 3") (хотя для этого примера это не так уж долго, представьте, что есть 50 коммитов). или что-то среднее).
Первое, что я хочу, это локальная ветка удаленной стороны:
git checkout -b squashing origin/master
Далее я хочу быстро раздавить его
git reset --soft 682b412~
git commit -m "Squashed upstream"
Обратите внимание на символ тильды ~
. Это приводит к тому, что наша ветвь находится у родителя первого коммита в диапазоне, который мы хотим сжать, и, поскольку мы указали --soft
, наш индекс все еще находится на последнем коммите в диапазоне, который мы хотим сжать. Строка коммита приводит к единому коммиту, состоящему из того, что было с первого по последнее включительно.
На данный момент исходная/главная и сжимающая ветки имеют идентичное содержимое дерева, но разные истории.
Теперь мы говорим git, что, когда он увидит ссылки на исходный коммит origin/master, вместо этого использовать наш сжатый коммит. Используя git log
, я вижу, что новый коммит «Squashed upstream» — 1f0bc14, поэтому мы делаем:
git replace f578cbb 1f0bc14
С этого момента ваш git будет использовать коммит «squashed upstream».
Вернемся к нашей исходной ветке (если она была "master")
git checkout master
git merge f578cbb
Похоже, что это объединяет мастер-источник (f578cbb), фактически получает содержимое 1f0bc14, но регистрирует его как родительский SHA1 f578cbb.
Нам больше не нужна раздавливающая ветка, так что можете от нее избавиться.
Теперь предположим, что апстрим добавил больше возможностей. В этом простом примере в репозитории основной ветки журнал может показать следующее:
84f5044 new feature
f578cbb sample more 3
7bc88cf sample more 2
682b412 sample more 1
29ed293 More stuff
018cb03 Another commit
a5166b1 Initia
Однако после того, как мы получим восходящий поток, если мы посмотрим на его журнал из нашего репо, вместо этого мы увидим это:
84f5044 new feature
f578cbb squashed upstream
29ed293 More stuff
018cb03 Another commit
a5166b1 Initial
Обратите внимание, как нам кажется, что история также сжата, и, что более важно, сжатый SHA1 восходящего потока показывает тот, который использовался в истории восходящего потока (для них это действительно коммит «sample more 3»).
Таким образом, слияние продолжает работать как обычно.
git merge origin/master
Но у нас нет такого захламленного лога:
4a9b5b7 Merge remote-tracking branch 'origin/master' for new feature
46843b5 Merge remote-tracking branch 'origin/master'
84f5044 new feature
f578cbb squashed upstream
fc6e1b3 Merge remote-tracking branch 'origin/master'
29ed293 More stuff
9577f30 my local change
018cb03 Another commit
a5166b1 Initial
Если бы коммит «новой функции» в восходящем потоке был таким же большим количеством коммитов, мы могли бы повторить этот процесс, чтобы также уменьшить его.
person
John O'M.
schedule
28.06.2015