J'ai deux branches devel
et next
. En développement, j'ai un nombre plus ou moins énorme de commits. Certains des commits sont pris en charge next
. J'ai également ajouté quelques commits au suivant qui sont fusionnés devel
.
Maintenant, j'aimerais voir ce qui manque next
, afin de pouvoir tester les modifications en détail avant de les apporter next
. Ma question est maintenant, comment puis-je voir quels commits sont dans devel
mais pas dans le suivant?
Réponses:
La commande peu utilisée
git cherry
vous montre les commits qui n'ont pas encore été sélectionnés. La documentation pourgit cherry
est ici , mais, en bref, vous devriez simplement pouvoir faire:... et voir la sortie un peu comme ceci:
Les commits qui commencent par
+
seront ceux que vous n'avez pas encore sélectionnésnext
. Dans ce cas, je n'avais sélectionné qu'un seul commit pour l'instant. Vous voudrez peut-être ajouter le-v
paramètre à lagit cherry
commande, afin qu'elle affiche également la ligne d'objet de chaque validation.la source
git checkout devel
, vous pouvez simplement le fairegit cherry next devel
.-v
" ? Cerise sans a,-v
c'est commels
sans-la
. ; -Jcherry
marquer ou exclure des commits équivalents, n'est-ce pas?cherry
semble être une commande de plomberie, mais n'offre pas (ne semble pas) offrir de nombreuses options. Pour ce que je suis actuellement au milieu,git cherry
me donne de faux positifs, mais @ sehegit log --cherry-pick
exclut correctement les commits précédemment sélectionnés / rebasés.En outre, vous pouvez utiliser
pour obtenir une belle liste de commits différents réels non partagés entre les branches.
Le mot clé est
--cherry-pick
Mise à jour Comme mentionné dans un commentaire, les versions récentes de git ont ajouté
--cherry-mark
:la source
Vous pouvez essayer de créer des sous-ensembles de journaux git:
la source
--left-only
aurait été mieux). Cependant, celui-ci peut être amélioré un peu en ajoutant--no-merges
pour omettre les commits de fusion (par exemple, si une fonctionnalité ou une branche de correctif a été fusionnée (séparément) dans devel et next). À proprement parler, bien sûr, la résolution des conflits dans les fusions peut créer d'autres différences, mais ce n'est généralement pas le cas. L'--no-merges
option peut également être utilement appliquée aux autres réponses.Que diriez-vous
Le résultat est similaire à la réponse de Byran (ordre différent de commits) mais nos deux réponses produiront des commits différents entre les branches, plutôt que de montrer ce qui se trouve dans une branche et pas dans l'autre.
la source
git log next..
Pour obtenir la liste des commits qui n'ont pas été intégrés dans la branche de publication (suivante), vous pouvez utiliser:
Consultez git-rev-list pour plus d'informations.
la source
next...devel
@Mark Longair l'a cloué dans sa réponse ici , mais j'aimerais ajouter quelques informations supplémentaires.
Associé, et répondre à la question de savoir comment diviser une grande demande de tirage (PR), en particulier lorsque l'écrasement de vos validations est impossible en raison d'une ou plusieurs fusions de master dans votre feature_branch
Ma situation:
j'ai fait un gros
feature_branch
avec 30 commits et ouvert une Pull Request (PR) sur GitHub pour la fusionnermaster
. La branche amaster
changé une tonne sous moi et a reçu 200 commits que jefeature_branch
n'avais pas. Pour résoudre les conflits que j'ai faitsgit checkout feature_branch
etgit merge master
pour fusionnermaster
les modifications apportées à monfeature_branch
. J'ai choisimerge
plutôt querebase
sur le dernier maître, donc je devrais résoudre les conflits une seule fois au lieu de potentiellement 30 fois (une fois pour chacun de mes commits). Je ne voulais pas écraser mes 30 commits en 1 d'abord, puis rebaser sur le derniermaster
car cela pourrait effacer l'historique des commentaires sur GitHub dans le PR. Donc, j'ai fusionné master dans ma branche de fonctionnalités et résolu les conflits une seule fois. Tout allait bien. Mon PR, cependant, était trop gros pour que mes collègues puissent l'examiner. J'avais besoin de le diviser. Je suis allé écraser mes 30 commits et OH NON! OÙ SONT-ELLES? ILS SONT TOUS INTERMÉLANGÉS AVECmaster
les 200 commits récents maintenant parce que j'ai fusionnémaster
dans monfeature_branch
! QUE FAIS-JE?git cherry
utilisation au cas où vous voudriez essayergit cherry-pick
des commits individuels:git cherry
à la rescousse (en quelque sorte)!Pour voir tous les commits qui sont dans
feature_branch
mais PAS dans,master
je peux faire:OU, je peux vérifier les commits de N'IMPORTE QUELLE branche sans m'assurer que je suis le
feature_branch
premier en faisantgit cherry [upstream_branch] [feature_branch]
, comme ceci. Encore une fois, cela vérifie pour voir quels commits SONT dansfeature_branch
mais ne sont PAS dansupstream_branch
(master
dans ce cas):L'ajout
-v
montre également les lignes d'objet du message de validation:La redirection vers "word count" "-lines" (
wc -l
) compte le nombre de commits:Vous pouvez comparer ce nombre au numéro de validation indiqué dans votre PR GithHub pour vous sentir mieux en sachant que
git cherry
cela fonctionne vraiment. Vous pouvez également comparer les hachages git un par un et voir qu'ils correspondent entregit cherry
et GitHub. Notez quegit cherry
ne compteront pas tous les commits de fusion où vous avez reportésmaster
dansfeature_branch
, mais GitHub. Donc, si vous voyez une petite différence dans le décompte, recherchez le mot "fusion" sur la page de validation de GitHub PR et vous verrez probablement que c'est le coupable qui n'apparaît pasgit cherry
. Ex: un commit intitulé "Fusionner la branche 'master' dans feature_branch" apparaîtra dans le GitHub PR mais pas lors de l'exécutiongit cherry master feature_branch
. C'est bien et attendu.Donc, maintenant j'ai un moyen de savoir quels diffs je pourrais vouloir choisir une nouvelle branche de fonctionnalités pour diviser ce diff: je peux utiliser
git cherry master feature_branch
localement, ou regarder les commits dans le GitHub PR.Comment l'écrasement pourrait aider - si seulement nous pouvions écraser:
Une alternative, cependant, pour diviser mon gros diff est d' écraser tous mes 30 commits en un seul, de les patcher sur une nouvelle branche de fonctionnalité, de réinitialiser le commit du correctif, puis de l'utiliser
git gui
pour ajouter des morceaux fichier par fichier, morceau par morceau, ou ligne par ligne. Une fois que j'ai une sous-fonctionnalité, je peux valider ce que j'ai ajouté puis vérifier une nouvelle branche, en ajouter d'autres, valider, vérifier une nouvelle branche, etc., jusqu'à ce que ma grande fonctionnalité soit divisée en plusieurs sous-fonctionnalités . Le problème est que mes 30 commits sont mélangés avec les 200 autres commits d'autres personnes en raison de mongit merge master
dans monfeature_branch
, donc le rebasage est donc peu pratique, car je devrais passer au crible 230 commits pour réorganiser et écraser mes 30 commits.Comment utiliser un fichier de correctif comme remplacement beaucoup plus facile de l'écrasement:
Une solution consiste simplement à obtenir un fichier de correctif contenant un «équivalent squash» de mes 30 commits, à le patcher sur un nouveau fork de
master
(une nouvelle sous-branche de fonctionnalité) et à travailler à partir de là, comme suit:Maintenant, mon correctif de 30 commit est appliqué localement, mais non mis en scène et non validé.
Maintenant, utilisez
git gui
pour ajouter des fichiers, des morceaux et / ou des lignes et briser votre gros PR ou "diff":Notez que si vous ne l'avez pas
git gui
, vous pouvez facilement l'installer dans Ubuntu avecsudo apt install git-gui
.Je peux maintenant exécuter
git gui
et commencer à ajouter des fichiers, des morceaux et / ou des lignes (en cliquant avec le bouton droit dans le programme git GUI), et diviser la branche de 30 fonctionnalités de validation en sous-branches comme décrit ci-dessus, en ajoutant, en validant, puis en forçant à plusieurs reprises une nouvelle branche de fonctionnalité et répéter ce cycle jusqu'à ce que toutes les modifications aient été ajoutées à une sous-branche de fonctionnalité et que ma fonctionnalité 30-commit soit divisée avec succès en 3 ou 4 sous-fonctionnalités. Je peux maintenant ouvrir un PR distinct pour chacune de ces sous-fonctionnalités, et elles seront plus faciles à examiner pour mon équipe.Références:
la source