J'essaie d'avoir deux branches avec des fichiers binaires en git - un "développement" et un "stable". La branche de développement peut avoir plusieurs changements de ces fichiers avant de les "relâcher" à la branche stable (et la branche stable a ces fichiers renommés, au cas où cela serait pertinent).Git fusionne à plusieurs reprises le squash
Je pourrais faire une fusion normale, cela fonctionne très bien, mais préserve trop d'historique - en tirant la branche "stable", tous les commits intermédiaires de la branche "développement" sont tirés aussi (parce qu'ils sont parents commits) . Mais nous parlons de fichiers binaires qui n'ont pas de stratégie de fusion sensée (sauf la leur/la nôtre), donc l'historique réel des fichiers sur la branche de développement est inutile. Quand je tire la branche « stable », je reçois ceci:
X-------------------G stable / / a---b---c---d---e---f---g development
Parce que G a un parent dans la branche de développement, je reçois toute l'histoire de la branche de développement (objets de données pour c, d, e, f et g) dans mon dépôt, ce qui ne m'intéresse pas (X est le même que b, avec un certain changement de nom de fichier appliqué).
J'ai donc essayé de modifier git merge --squash
de la branche de développement vers la branche stable. La première fusion et engagement se sont OK, les résultats ont été comme prévu (nice journal des modifications dans le message de commit, aucun rapport avec la branche de développement):
X-------------------G stable / a---b---c---d---e---f---g development
Après je tire cette squashed branche stable, je reçois cela en mon dépôt, qui est ce que je veux:
a---b---X---G
Mais la deuxième fusion a échoué (car git avait aucun moyen de savoir combien je déjà fusionné et suis devenu confus).
- Est-il possible d'enregistrer en quelque sorte la fusion, sans produire un "commit de fusion" avec deux parents?
- Ou, est-il possible de dire à git de ne fusionner qu'une certaine "plage" de révisions, comme dans SVN?
- Ou, est-il possible de faire une fusion normale sans avoir à télécharger toutes les références de l'autre branche lors du tirage?
- Ou devrais-je fournir un pilote de fusion personnalisé pour les fichiers en question, qui renomme simplement "leur" version en "notre", résolvant ainsi les conflits? J'ai toujours peur que
--squash
essaye toujours de fusionner toute l'histoire, jusqu'au parent commun, résolvant seulement la moitié de mon problème.
Mise à jour: rebasage
Si je comprends rebasage correctement, je vais finir avec ceci:
X stable / a---b---c---d---e---f---g development
Ce qui me reçoit toutes les données que je ne suis pas intéressé (c , d, e, f) et en prime, je perds l'information que b était une version stable dans la branche. Chaque révision de développement ajoute environ 5 Mo à la taille du dépôt (et le remballage de tout le rapport ne le réduit que d'environ 10%), la branche "stable" est presque gratuite (les données sont déjà là). Je veux tirer une seule nouvelle révision de la branche stable pour tirer seulement le nouveau 5MB, mais au lieu de mettre à jour de X à G télécharge 25MB, parce que je ne suis pas en mesure de dire que je ne me soucie pas du contenu de c, d , e et f.
Cela semble très bien, mais je ne comprends pas exactement pourquoi il est nécessaire de créer une branche temporaire, puis le renommer. Est-ce parce que vous êtes encore détaché après le commit? –
@ kim-sullivan: le "exactement pourquoi": quand vous faites le commit dans l'exemple ci-dessus, il déplace "HEAD" mais pas "stable" pour pointer vers le nouveau commit - la tête est toujours "détachée", et ' stable' pointe toujours vers la version précédente (X, dans votre exemple original). Faire la branche et renommer (le checkout est techniquement optionnel, mais sans cela vous devrez fournir des arguments à 'git branch -M', et vous serez toujours détaché, ce qui est probablement non souhaitable) à J (par la réponse). – lindes
En outre: Vous pouvez trouver 'git log --graph --oneline --all --decorate' et' git status' à chaque point de cette série de commandes pour être informatif. Et/ou en regardant le contenu de divers fichiers dans .git /, peut-être avec 'grep. .git/HEAD .git/refs/heads/* ' – lindes