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 № 1Cela 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 demaster
(et marquez lespecific_feature
branche commetmp
) - fusionner
Y
(le derniernew_feature
commit qui a été fusionné dansspecifc_feature
) dans le nouveauspecific_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.