Je travaille actuellement sur une branche et je souhaite que certains commits fusionnent dans d'autres branches:
a-b-c-d-e-f-g (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
\
x-x-x-x-x (branchB)
(Les lettres indiquent des validations et les "x" sont des validations non pertinentes.)
Cependant, j'ai remarqué que ce serait une bonne idée de regrouper certains commits. Je veux "concaténer" le commit a, d, e et g dans un patch et le commettre en master. Les validations b et f doivent aller comme une seule validation dans branchB. Existe-t-il une bonne façon de le réaliser?
Réponses:
La commande que vous recherchez est
git rebase
, en particulier, l'-i/--interactive
option.Je vais supposer que vous voulez laisser le commit c sur la branche A, et que vous voulez vraiment dire que vous voulez déplacer les autres commits vers les autres branches, plutôt que de fusionner, car les fusions sont simples. Commençons par manipuler la branche A.
Le
^
signifie le commit précédent, donc cette commande dit de rebaser la branche A en utilisant le commit avant "a" comme base. Git vous présentera une liste des commits dans cette plage. Réorganisez-les et dites à git d'écraser les bons:Maintenant, l'histoire devrait ressembler à ceci:
Maintenant, prenons le commit b + f nouvellement écrasé pour branchB.
Et pareil pour a + d + e + g pour master:
Enfin, mettez à jour branchA pour qu'il pointe vers c:
Nous devrions maintenant avoir:
Notez que si vous avez plusieurs commits que vous souhaitez déplacer entre les branches, vous pouvez utiliser rebase à nouveau (de manière non interactive):
Enfin, un avertissement: il est tout à fait possible de réorganiser les commits de telle sorte que certains ne s'appliquent plus proprement. Cela peut être dû au fait que vous avez choisi un mauvais ordre (mettre un correctif avant le commit introduisant la fonctionnalité qu'il a corrigée); dans ce cas, vous voudrez abandonner le rebase (
git rebase --abort
). Sinon, vous devrez résoudre intelligemment les conflits (comme vous le faites avec les conflits de fusion), ajouter les correctifs, puis exécutergit rebase --continue
pour passer à autre chose. Ces instructions sont également fournies par le message d'erreur imprimé lorsque le conflit se produit.la source
git branch -f branchA branchA^^
faux? À savoir, branchA ne devrait-il pas pointer vers c à ce stade, de sorte que la première ligne du diagramme soitc (branchA)
et nonc - [a+d+e+g] - [b+f] (branchA)
?git branch -f branchA branchA^^
pourquoi ne pouvez-vous pas simplement faire ungit reset --hard <sha1 of c>
sur la branche A?Où
3
est le nombre de commits qui doivent être réorganisés ( source ).Cela ouvrira vi , listant les commits du plus ancien (en haut) au plus récent (en bas).
Maintenant, réorganisez les lignes, enregistrez et quittez l'éditeur.
ddp
déplacera la ligne actuelle vers le basddkP
déplacera la ligne actuelle vers le haut ( source )la source
git rebase --interactive
est la commande souhaitée.Exemple:
L'état actuel est le suivant:
Je veux réorganiser les commits
9a24b81
(troisième commit) et7bdfb68
(deuxième commit). Pour ce faire, je trouve d'abord le commit avant le premier commit que nous voulons changer . C'est commit186d1e0
(premier commit).La commande à exécuter est
git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
, dans ce cas:Cela ouvre un fichier dans l'éditeur par défaut avec le contenu suivant:
Notez que l'ordre des commits dans le fichier est opposé à celui utilisé pour git log. Dans git log, le commit le plus récent est en haut. Dans ce fichier, le commit le plus récent se trouve en bas.
Comme l'explique le commentaire au bas du fichier, je peux faire différentes choses, comme écraser, supprimer et réorganiser les commits. Pour réorganiser les commits, j'édite le fichier pour qu'il ressemble à ceci (les commentaires du bas ne sont pas affichés):
La
pick
commande au début de chaque ligne signifie "utiliser (c'est-à-dire inclure) ce commit" et quand j'enregistre le fichier temporaire avec les commandes rebase et quitte l'éditeur, git exécutera les commandes et mettra à jour le référentiel et le répertoire de travail:Notez l'historique de validation réécrit.
Liens:
la source
git rebase --interactive
pour atteindre l'objectif du PO?Si vous souhaitez réorganiser uniquement les deux derniers commits , vous pouvez utiliser cet
git reorder
alias: https://stackoverflow.com/a/33388211/338581la source
git rebase est ce que vous voulez. Découvrez l'option --interactive.
la source