Comment puis-je, avec un minimum d'effort, écraser tous mes commits (même avec des fusions et des résolutions de conflits) en un seul sur une branche de fonctionnalité, puis rebaser au-dessus de la branche où j'ai commencé à développer de? Vous ne voulez pas refaire la résolution des conflits qui est déjà effectuée . Réduisez les tracas au minimum.
Supposons que les branches dont nous parlons soient master et featureX.
3 Réponses :
Le moyen le plus simple que je connaisse est
git checkout featureX git merge -m "Bring latest changes from master" master # magic starts here git reset --soft master # put featureX branch pointer on top of master tip # at this point all the changes related to featureX are on staging area git commit -m "Feature X in a single shot"
Et voilà. Pas de rebasage, pas d'écrasement.
Assez intelligent, bien que cela suppose que vous voulez écraser tout le travail de featureX en un seul commit.
Ajout d'un peu plus d'informations sur la question pour la clarifier
En supposant que l'objectif est de fusionner les modifications sur master, ajoutez ce qui suit: $ git checkout master; git merge featureX
Il semble que vous souhaitiez utiliser des fusions squash.
git checkout master git merge --squash featureX git commit
Ceci applique toutes les modifications apportées à master comme si vous aviez fusionné (ou rebasé) featureX, en un seul "non-fusion" commit.
Il y a plusieurs raisons à cela. Il est possible d'écraser et de rebaser en une seule étape simplement en effectuant un rebase interactif, mais (1) il n'y a pas vraiment besoin de le faire si vous allez écraser chaque commit intermédiaire - dans ce cas, la fusion de squash est un raccourci réalisable; et (2) vous avez noté qu'il peut y avoir des branchements et des fusions intermédiaires en cours dans l'historique de featureX dans lequel vous fusionnez; rebase ne traitera pas cela facilement.
Est-ce que je me trompe ou vous déplaceriez le maître au lieu de la fonction X? Le workflow pourrait fonctionner avec un peu plus de travail ... plus que ma recette? git checkout --detach master; git merge --squash featureX; git commit -m "un seul coup pour featureX"; git branch -f featureX; git checkout featureX
.
Commencez par vérifier avec git branch
quelle est votre branche de travail actuelle. Ensuite, si ce n'est pas déjà featureX
, passez-y en utilisant git checkout featureX
.
Nous allons maintenant déterminer combien de commits là où vous voulez écraser en un. Pour cela, nous utiliserons git log
. Pour en avoir une meilleure vue, utilisez git log --graph --decorate --pretty = oneline --abbrev-commit
.
À côté de l'écrasement proprement dit: git rebase -i HEAD ~
ou utilisez le hachage SHA git rebase -i
. Si vous avez besoin d'aide pour cette étape, voici deux articles très intéressants: https://thoughtbot.com/blog/git-interactive-rebase-squash-amend-rewriting-history et https://medium.com/@dirk.avery/the-definitive-git-rebase-guide-dbd7717f9437
Nous voulons maintenant nous assurer que nous avons la dernière version de la branche master
. git checkout master
suivi de git pull origin master
(en supposant que vous utilisez origin comme amont) et git checkout featureX
.
Enfin, nous pouvons rebase featureX
sur master
en utilisant git rebase master
et pouvons pousser featureX
vers GitHub, GitLab ou partout où nous voulons. git push origin featureX
.
Remarque: si vous avez déjà poussé featureX
, vous devrez forcer push git push origin featureX --force
. Assurez-vous de ne faire cela que sur les branches sur lesquelles vous travaillez et qui ne sont pas partagées, sinon les gens auront des problèmes.
Vous trouverez ici un article expliquant tout le rebase et le squash pour garder l’historique des commits propre: https://blog.carbonfive.com/2017/08/28/always-squash-and-rebase-your-git-commits/ a>
ah .... cela vous ressemble-t-il à un seul coup
? :-D Regardez la recette que j'ai fournie comme réponse.