29 votes

Git merge de la courge à plusieurs reprises

Je suis d'essayer d'avoir deux branches avec des fichiers binaires dans git un "développement" et un "stable". La branche de développement peut avoir plusieurs modifications de ces fichiers avant de les je veux "libération" à la branche stable (et la branche stable a ces fichiers renommés, dans le cas où c'est pertinent).

Je pourrais faire une normale de fusion, cela fonctionne bien, mais conserve trop de l'histoire - quand on tire la "stabilité" de la branche, tous les intermédiaires s'engage à partir du "développement" de la branche sont tirés aussi bien (parce qu'ils parent s'engage). Mais nous parlons de fichiers binaires qui n'ont pas de n'importe quelle stratégie de fusion (à l'exception de leur/de la nôtre), de sorte que l'histoire réelle des fichiers sur la branche de développement est inutile. Quand je tire dessus, la "stabilité" de la branche, j'obtiens ceci:

 X-------------------G stable
 / /
 a---b---c---d---e---f---g développement

Parce que G a un parent dans la branche de développement, j'ai l'ensemble de l'histoire de la branche de développement (objets de données pour c, d, e, f et g) dans mon référentiel, dont je ne suis pas intéressé (X) est le même que b, avec quelques renommage de fichiers appliquée).

J'ai donc essayé d' git merge --squash des changements de la direction du développement de la branche stable. La première fusion et de s'engager est 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 développement

Après je tirer de cette écrasé branche stable, je reçois dans mon référentiel, qui est ce que je veux:

a---b---X---G

Mais le deuxième fusion a échoué (parce que git n'avait aucun moyen de savoir combien j'ai fusionné déjà et n'ai pas compris).

  • Est-il possible de faire en quelque sorte enregistrement de la fusion, sans la production d'une "fusion s'engager" avec deux parents?
  • Ou, est-il possible d'indiquer à git de fusionner seulement une certaine "marge" des révisions, comme dans le SVN?
  • Ou, est-il possible de faire une activité normale de fusion sans avoir à télécharger de toutes les refs de l'autre, de la direction de tirage?
  • Ou dois-je fournir une coutume de fusion pilote pour les fichiers en question, que tout simplement renomme "leur" version de "notre", de façon à résoudre les conflits? Je suis toujours peur qu' --squash vont toujours essayer de fusionner l'ensemble de l'histoire, jusqu'à la mère commune, de la résolution de seulement la moitié de mon problème.

Mise à jour: changement d'année de base

Si je comprends rebasage correctement, je vais mettre fin à ceci:

 X stable
/
 a---b---c---d---e---f---g développement

Ce qui me fait toutes les données que je ne suis pas intéressé (c, d, e, f) et en bonus, je vais perdre l'information que b est une version stable de la branche.

Chaque développement de révision ajoute environ 5 mo pour le dépôt de la taille (et remballage de l'ensemble des pensions de la rétrécit, seulement 10% environ), la "stabilité" de la branche vient presque gratuitement (les données sont déjà là). Je veux tirer une seule nouvelle révision de la branche stable de ne retirer que la nouvelle 5MO, mais au lieu de la mise à jour de X à G téléchargements 25MO, parce que je suis de toute façon pas en mesure de dire que je n'ai pas de soins sur le contenu de c, d, e et f.

25voto

pvillela Points 366

En commençant par

      X stable
     /                   
a---b---c---d---e---f---g development

Vous pouvez utiliser les étapes suivantes pour copier le dernier commit de votre branche de développement de votre branche stable:

git checkout development@{0}  # get working tree from "development", detach HEAD
git reset --soft stable  # reposition detached HEAD on "stable"
git commit  # enter the appropriate commit message
git branch temp  # create a temporary branch "temp" at HEAD
git checkout temp  # get on the new temporary branch
git branch -M stable  # rename "temp" to "stable"

si vous vous retrouvez avec:

      X-------------------G stable
     /                   
a---b---c---d---e---f---g development

Si vous continuez à travailler sur le "développement", par exemple,

      X-------------------G stable
     /                   
a---b---c---d---e---f---g---h---i---j development

vous pouvez répéter les mêmes commandes git comme ci-dessus et vous allez vous retrouver avec:

      X-------------------G-----------J stable
     /                   
a---b---c---d---e---f---g---h---i---j development

8voto

Ce n'est pas le bon endroit pour utiliser fusion --squash. Un bon endroit pour l'utiliser, il est en jetant un sujet de branche, qui vous vont fusionner dans votre branche principale avant de s'en débarrasser. Tout le développement dans le thème de la branche est montré comme un commit de la branche principale. Dans votre situation, vous devriez fusion de la direction du développement normalement, et ensuite utiliser git-git rebase --interactive pour écraser les commits que vous voulez.

Est-il possible de faire en quelque sorte enregistrement de la fusion, sans la production d'une "fusion s'engager" avec deux parents?

Si je comprends correctement à la question, non. Absolument pas.

Est-il possible d'indiquer à git de fusionner seulement une certaine "marge" des révisions, comme dans le SVN?

Oui. git merge [commettre hachage]

Ou, est-il possible de faire une activité normale de fusion sans avoir à télécharger de toutes les refs de l'autre, de la direction de tirage?

Voir la réponse à la question précédente.

Ou dois-je fournir une coutume de fusion pilote pour les fichiers en question, que tout simplement renomme "leur" version de "notre", de façon à résoudre les conflits? Je suis toujours peur que --squash va toujours essayer de fusionner l'ensemble de l'histoire, jusqu'à la mère commune, de la résolution de seulement la moitié de mon problème.

Non! Il suffit de ne pas utiliser git merge --squash. Ce n'est pas le bon endroit pour l'utiliser!

4voto

knittl Points 64110

vous pouvez utiliser git rebase -i (mode interactif) à sqash toutes vos modifications, il suffit de modifier les lignes d' m ou meld

vous que d'avoir un seul commit qui vous pouvez fusionner. si vous voulez que chaque étape de la vôtre réservé, vous devez créer une autre branche sur votre piratage de la branche avant de faire cela, cela peut être fait avec git branch small-dirty-changes-i-don't-want-anybody-to-see

tout cela doit être fait avant de tenter de fusionner; étape par étape:

# on branch "hacking": hack commit hack commit hack commit

# create a reference to your history
$ git branch dirty-history

# sqash your commits by setting all lines to "meld"
$ git rebase -i

# checkout master or the branch you want to merge to
$ git checkout master

# merge your squashed commit
$ git merge hacking
# or: $ git pull hacking

-1voto

Glenn Moss Points 2363

Je suis nouveau sur git, mais il semble que l' --squash est ce que vous voulez, il vous suffit de manipuler la branche différemment.

$ git merge --squash development
$ git branch -d development
$ git checkout -b development
# continue work on development branch

Cela aurait pour effet de tronquer l'histoire de la direction du développement et de la prochaine fusion ne serait ce que tu voulais. En regardant la page de man, il semble que git branch -f development pourrait faire la même chose que de supprimer et de recréer de la branche.

Comme je l'ai dit, je suis assez nouveau à git, donc j'aimerais des commentaires sur cette idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X