2012-08-31 3 views
0

Lorsque je travaille sur une grande fonctionnalité qui me prend quelques jours à implémenter, j'effectue de nombreux petits commits dans mon dépôt git local et je retire également les modifications des autres référentiel maître distant. Une fois la fonction terminée, mon git locale ressemble en quelque sorte:Comment compresser plusieurs validations git locales qui sont entrelacées avec des validations à distance

  1. commit locale: Dernière étape de la fonction X
  2. commit à distance: B
  3. commettras locale: une partie de la fonction X
  4. engager local: une partie de la fonction X
  5. engager à distance: Un
  6. engagement local: la première étape de la fonction X.
  7. ...

Maintenant, je voudrais pousser tous les commits locaux au dépôt distant comme un seul commit qui ajoute la caractéristique X. Squashing commets avec 'git rebase' ne fonctionnera pas dans ce cas, car les commits à distance ne sont pas fait par moi (2 et 5) aurait aussi besoin d'être écrasé, ce qui n'est pas une option. La seule façon que j'ai réussi à comprendre était d'avoir une branche propre avec seulement des commits à distance, d'émettre 'git diff' contre ma branche de développement locale et d'appliquer un patch résultant sur la branche clean. Ensuite, validez les modifications corrigées et appuyez sur. Y a-t-il un meilleur moyen?

+1

On dirait que vous devez penser à votre flux de travail git. Je recommande habituellement de faire du développement dans une branche de _ branche et de fusionner ou d'y introduire _master_ seulement quand c'est absolument nécessaire. Une fois que la fonction est prête ou au moins ne casse rien, elle peut être fusionnée avec le maître. De cette façon, l'historique reste propre et il n'est pas nécessaire de rebaser. – opqdonut

+0

Mais avez-vous encore besoin d'écraser les validations locales intermédiaires en une validation finale ou existe-t-il un moyen d'éviter cela? –

+0

Si vous voulez vraiment/avez besoin de squash, vous pouvez le faire. Un raccourci est d'utiliser 'git merge --squash'. Mais il devrait être nécessaire d'écraser au cours du développement normal IMO. – opqdonut

Répondre

1

J'ai trouvé la réponse: git rebase -i permet réellement de réordonner les commits, et quand tous les commits locaux sont réorganisés pour être en séquence (pas entrelacés avec des commits distants), ils peuvent tous être écrasés en un.

Questions connexes