Я пытаюсь иметь две ветви с бинарными файлами в git - одну «разработку» и одну «стабильную». В ветке разработки может быть несколько изменений этих файлов, прежде чем я хочу «освободить» их до стабильной ветви (и стабильная ветвь имеет эти файлы, переименованные, если это имеет значение).Git merge squash несколько раз
Я мог бы сделать нормальное слияние, это прекрасно работает, но сохраняет слишком много истории - когда тянет «стабильную» ветвь, все промежуточные фиксации из ветви «развития» также вытягиваются (потому что они являются родительскими) , Но мы говорим о двоичных файлах, которые не имеют разумной стратегии слияния (кроме их/наших), поэтому фактическая история файлов в ветке разработки бесполезна. Когда я тяну «стабильный» филиал, я получаю это:
X-------------------G stable / / a---b---c---d---e---f---g development
Поскольку G имеет родитель в отрасли разработки, я получаю всю историю отрасли разработки (объекты данных для C, D, E, F и g) в моем репозитории, который меня не интересует (X - это то же, что и b, с некоторым переименованием файлов).
Таким образом, я попытался до git merge --squash
изменений от ветви развития до стабильной ветви. Первое такое слияние и совершить пошло КИ, результаты были, как и ожидалось (хороший журнал изменений в сообщении фиксации, никакого отношения к отрасли развития):
X-------------------G stable / a---b---c---d---e---f---g development
После я тяну эту сжатую стабильную ветку, я получаю это в мой репозиторий, который является то, что я хочу:
a---b---X---G
Но второе слияние не удалось (потому что мерзавец не было никакого способа узнать, сколько я слился уже и запутался).
- Возможно ли каким-либо образом записать слияние, не производя «слияния» с двумя родителями?
- Или можно сказать git, чтобы объединить только определенный «диапазон» ревизий, например, в SVN?
- Или, возможно ли выполнить нормальное слияние без необходимости загружать все ссылки с другой ветки при потянув?
- Или я должен предоставить пользовательский драйвер слияния для соответствующих файлов, который просто переименовывает «свою» версию в «наш», тем самым разрешая конфликты? Я все еще боюсь, что
--squash
всегда будет пытаться объединить всю историю, вплоть до общего родителя, решая только половину моей проблемы.
Update: перебазирования
Если я правильно понял перебазирования, я в конечном итоге с этим:
X stable / a---b---c---d---e---f---g development
Который получает меня все данные, я не заинтересован в (с , d, e, f) и в качестве бонуса я потеряю информацию о том, что b является стабильной версией в ветке.
Каждый модификатор развития добавляет около 5 МБ к размеру репозитория (и переупаковка всего репо сокращает его примерно на 10%), «стабильная» ветвь приходит почти бесплатно (данные уже есть). Я хочу вытащить одну новую ревизию из стабильной ветки, чтобы вытащить только новые 5 МБ, но вместо этого обновление с X до G загружает 25 МБ, потому что я как-то не могу сказать, что меня не интересует содержимое c, d , e и f.
Это выглядит великолепно, но я не понимаю, почему это необходимо для создания временной ветви, а затем переименовать ее. Это потому, что вы по-прежнему отстранены после совершения? –
@ kim-sullivan: «именно почему»: когда вы делаете фиксацию в приведенном выше примере, она перемещает 'HEAD', но не' stable', чтобы указывать на новую фиксацию - голова все еще «отсоединена», stable 'все еще указывает на предыдущую версию (X, в вашем исходном примере). Выполнение ветки и переименование (проверка является технически необязательной, но без нее вам нужно будет доставлять аргументы в 'git branch -M', и вы все равно будете отсоединены, что, вероятно, нежелательно) вызывает стабильную точку к J (за ответ). – lindes
Кроме того: вы можете найти пробег 'git log -graph -oneline -all -decorate' и' git status' в каждой точке этой серии команд, чтобы быть информативным. И/или просмотр содержимого различных файлов в .git /, возможно, с помощью команды grep. .git/HEAD .git/refs/heads/* ' – lindes