1
votes

Comment écraser / rebaser en un seul coup

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.


0 commentaires

3 Réponses :


2
votes

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.


3 commentaires

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



-2
votes

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.


1 commentaires

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 .



0
votes

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/


1 commentaires

ah .... cela vous ressemble-t-il à un seul coup ? :-D Regardez la recette que j'ai fournie comme réponse.