Une solution
La solution sur la base de git show-branch
n'a pas tout à fait fonctionné pour moi (voir ci-dessous), donc je l'ai combiné avec celui de sur la base de git log
et je me suis retrouvé avec ça :
git log --decorate --simplify-by-decoration --oneline \ # selects only commits with a branch or tag
| grep -v "(HEAD" \ # removes current head (and branch)
| head -n1 \ # selects only the closest decoration
| sed 's/.* (\(.*\)) .*/\1/' \ # filters out everything but decorations
| sed 's/\(.*\), .*/\1/' \ # picks only the first decoration
| sed 's/origin\///' # strips "origin/" from the decoration
Limites et mises en garde
- HEAD peut être détaché (de nombreux outils CI le font pour s'assurer qu'ils construisent le bon commit dans une branche donnée), mais branche d'origine et branche locale doivent être à la fois à parité ou "au-dessus" le HEAD actuel.
- Il doit y avoir pas d'étiquettes de la manière (je présume ; je n'ai pas testé le script sur les commits avec une balise entre la branche enfant et la branche parent)
- le script s'appuie sur le fait que "HEAD" est toujours répertorié comme la première décoration par le
log
commande
-
en cours d'exécution le script sur
master
y develop
résulte (principalement) en <SHA> Initial commit
Les résultats
A---B---D---E---F <-origin/master, master
\ \
\ \
\ G---H---I <- origin/hotfix, hotfix
\
\
J---K---L <-origin/develop, develop
\
\
M---N---O <-origin/feature/a, feature/a
\ \
\ \
\ P---Q---R <-origin/feature/b, feature/b
\
\
S---T---U <-origin/feature/c, feature/c
Malgré l'existence de branches locales (par exemple, seulement origin/topic
est présent depuis le commit O
a été extrait par directement par son SHA), le script devrait s'imprimer comme suit :
- Pour les commits
G
, H
, I
(branche hotfix
) master
- Pour les commits
M
, N
, O
(branche feature/a
) develop
- Pour les commits
S
, T
, U
(branche feature/c
) develop
- Pour les commits
P
, Q
, R
(branche feature/b
) feature/a
- Pour les commits
J
, K
, L
(branche develop
) <sha> Initial commit
*
- Pour les commits
B
, D
, E
, F
(branche master
) <sha> Initial commit
* - ou master
si develop
Les commits de master sont au dessus du HEAD de master (~ le master serait en avance rapide pour développer)
Pourquoi show-branch n'a pas fonctionné pour moi
La solution sur la base de git show-branch
s'est avéré peu fiable pour moi dans les situations suivantes :
-
HEAD détaché - y compris les moyens de remplacement du boîtier de tête détaché
grep '\*' \
pour `grep '!' \ - et ce n'est que le début de tous les problèmes
-
en cours d'exécution le script sur
master
y develop
résulte en develop
et `` respectivement
-
branches sur
master
branche ( hotfix/
branches) se retrouvent avec le develop
en tant que parent depuis leur plus proche master
La branche parentale a été marquée avec !
au lieu de *
pour une raison.
0 votes
Cette question devrait être reformulée pour trouver le parent d'un parent.