Având o comite id-ul, cum pentru a determina dacă această ramură conține comis-o?

Ceea ce am'm încercat să fac este o versiune a verifica. Vreau să asigure codul rămâne pe partea de sus de o versiune minimă. Deci am nevoie de o modalitate de a ști dacă ramura curentă conține o anumită comis-o.

Comentarii la întrebare (6)
Soluția

Există mai multe modalități de a obține acest rezultat. Prima naiv opțiune este de a utiliza git log și de căutare pentru un anumit comite folosind grep, dar că nu este întotdeauna precis

git log | grep 

Esti mai bine să folosim git branchdirect pentru a găsi toate ramurile conțin datCOMMIT_ID` folosind

git branch --contains $COMMIT_ID

Următorul pas este de a afla ramură de curent care poate fi făcut din git 1.8.1 folosind

git symbolic-ref --short HEAD

Și combinate împreună, ca

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID

Dar comanda de mai sus nu't return true sau false și nu există o versiune mai scurtă care returnează codul de ieșire 0 dacă se angajeze în actuala sucursală SAU cod de ieșire 1 dacă nu

git merge-base --is-ancestor $COMMIT_ID HEAD

Codul de ieșire este frumos, dar ca vrei șir de "adevărat" sau "fals" ca răspunsul de care ai nevoie pentru a adăuga un pic mai mult, și apoi combinate cu "dacă" din bash ai

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
Comentarii (4)

Obține o listă de ramură(es) care conține specifice a comis-o.

# get all the branches where the commit exists
$ git branch --contains 

Verificați dacă o ramură specifică a comis-o.

# output the branch-name if the commit exists in that branch
$ git branch --contains  | grep 

Căutare ramura (să zicem, "facilitate") cu potrivire exactă.

$ git branch --contains  | grep -E '(^|\s)feature$'

de exemplu Dacă aveți 3 filiale locale numite "facilitate", feature1, feature2 atunci

$ git branch --contains  | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains  | grep -E '(^|\s)feature$'

# output
feature     

Puteți căuta, de asemenea, în ambele "locale" și "la distanță" ramuri (use -o) sau numai în "la distanță" ramuri (use -r).

# search in both 'local' & 'remote' branches  
$ git branch -a --contains  | grep -E '(^|\s)feature$'

# search in 'remote' branches  
$ git branch -r --contains  | grep -E '(^|\s)feature$'
Comentarii (3)

Extras comentariu de @torek ca raspuns:

Vezi propuse duplicat pentru modul de a găsi toate ramurile care conțin un anumit comis-o.

Pentru a afla dacă curent ramură conține comite C, utilizați "instalatii sanitare" comanda `git merge-de bază-este-strămoșilor. Ramura curentă conține C dacă C este un strămoș al CAPULUI, astfel:

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi

(Notă: în scripturi shell, o comandă care iese zero este "adevărat" în timp ce unul care iese nenul este "false".)

Comentarii (0)

Da o altă alternativă: git rev-lista <nume de ramură> | grep `git rev-analiza <comit>` Acest lucru funcționează cel mai bine pentru mine, deoarece s-ar lucra, de asemenea, pe plan local cache la distanță ramuri cum ar fi telecomenzi/origine/de master, pe care `git branch-conține câștigat't de lucru.

Acesta acoperă mai mult de OP's întrebarea despre "curent branch" dar mi se pare de prost de a cere un "orice filială" versiune de această întrebare, așa că am decis pentru a posta aici, oricum.

Comentarii (0)
git branch --contains  --points-at 

Se va reveni la ținta nume de ramură dacă comite id-ul există în această ramură. În caz contrar, comanda nu va reuși.

Comentarii (2)

Din această cauză are un frumos scripty răspunsuri, am'm adăugarea preferatele mele.

Acesta vă va arăta, pentru ultima $n se angajează în $br ramuri care conține fiecare:

br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'

Acesta este similar, dar nu la fel pentru o listă de filiale:

br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done
Comentarii (0)