/ / Fusionner les différences entre deux branches vers la troisième branche - git, diff

Fusionner le diff entre deux branches vers la troisième branche - git, diff

Supposons que j'ai deux branches, master et new_feature

J'étais censé travailler sur une fonctionnalité spécifique, je pensais que cette fonctionnalité ferait partie de new_feature alors, j'ai vérifié specific_feature branche hors de la new_feature branche, comme ça

git checkout -b specific_feature

Maintenant, j'ai fait beaucoup de développement dans ce specific_feature succursale, fusionné upstream/new_feature dedans plusieurs fois pour obtenir les modifications à distance.

Maintenant, j'arrive à savoir que mon specific_feature aurait dû être ramifié hors de master ne pas new_feature. (new_feature branche n'est pas prête à être poussée)

Y a-t-il un moyen pour que je puisse prendre la différence entre mes specific_feature branche et new_feature branche et appliquez ces modifications à la nouvelle branche, par exemple specific_feature_master (ramifié hors du maître)?

Réponses:

4 pour la réponse № 1

Cela semble un travail pour git rebase --onto:

git rebase --onto master new_feature specific_feature

Cela ne prendra que les commits après new_feature Jusqu'à specific_feature HEAD, et rejouez-les sur master.

Notez que vous devrez alors forcer le push specific_feature vers l'amont (si vous l'avez déjà poussé auparavant): git push --force specific_feature.

Cela peut être un problème si d'autres ont déjà retiré cette branche et y travaillent.


Davidriod souligne correctement que:

Je ne pense pas que cela fonctionnera car le PO a fusionné plusieurs fois le upstream/new_feature branche dans la branche specific_feature

Si new_feature n'a jamais été mis à jour (récupérer uniquement, ne jamais extraire), alors cela pourrait toujours fonctionner.
Si new_feature a été mis à jour (pull) et fusionné dans specific_feature, puis le rebase --onto ne jouerait que les derniers commits depuis la dernière fusion: ici, seulement z" les commits seraient rejoués, pas le premier z.

x--x--x

y--y--Y--y--y (new_feature)
  
z--M--z"--z" (specific_feature)

Au lieu de faire un tri sélectif, je voudrais:

  • faire specific_feature hors de master (et marquez le specific_feature branche comme tmp)
  • fusionner Y (le dernier new_feature commit qui a été fusionné dans specifc_feature) dans le nouveau specific_feature branche

C'est:

git checkout -b tmp specific_feature
git checkout -B specific_feature master
git merge $(git merge-base tmp new_feature) # that merges Y

----------M (specific_feature)
/         /
x--x--x         /
       /
y--y--Y--y--y (new_feature)
  
z--M--z"--z" (tmp)

Puis le rebase --onto peut utiliser ce même ancêtre commun Y comme base correcte:

git rebase --onto specific_feature $(git merge-base tmp new_feature) tmp
git branch -D tmp

----------M--z""--z"" (specific_feature)
/         /
x--x--x         /
       /
y--y--Y--y--y (new_feature)

1 pour la réponse № 2

Vous pouvez utiliser la commande git cherry pour récupérer le commit effectué sur la branche specific_feature et qui n'apparaît pas sur la branche origin / new_feature.

git cherry origin/new_feature specific_feature

Vous pouvez ensuite créer une nouvelle branche à partir de master etChoisissez tous ces commits. Mais si vous dépendez entre votre développement sur specific_feature et origin / new_feature, aucun scm ne résoudra cela pour vous.

git checkout -b specific_feature_master master
git cherry origin/new_feature specific_feature | egrep "^+" | awk "{print $2} | xargs git cherry-pick

Quelque chose comme ça devrait faire le point de départ pour résoudre votre problème.