Bir taahhüt kimliği verildiğinde, mevcut dalın taahhüdü içerip içermediğini nasıl belirleyebilirim?


156

Yapmaya çalıştığım şey bir sürüm kontrolü. Kodun minimum sürümün üstünde kalmasını sağlamak istiyorum. Bu yüzden mevcut şubenin belirli bir taahhüt içerip içermediğini bilmek için bir yola ihtiyacım var.



10
Belirtilen bir taahhüdü içeren tüm dalları nasıl bulacağınız için önerilen kopyaya bakın . Geçerli dalın C komutu içerip içermediğini öğrenmek için "sıhhi tesisat" komutunu kullanın git merge-base --is-ancestor. C'nin atası ise mevcut dalda C bulunur , yani:HEADif git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
torek

1
Merhaba, lütfen doğru cevap olarak seçilebilmesi için bunu bir cevap olarak gönderin =)
Ben

1
@Ben - Bir topluluk wiki yanıtı olarak ekledim.
Zitrax

1
@Remover: kabuk komut dosyalarında sıfır doğrudur, sıfır olmayan yanlıştır: C kuralının tersi. /bin/truebaşlangıçta exit 0ve /bin/falseolduğu gibi uygulandı exit 1. (Modern mermiler daha sonra inşa edilmiştir.)
torek

Yanıtlar:


220

Bu sonuca ulaşmanın birçok yolu vardır. İlk saf seçenek git logkullanarak belirli bir taahhüdü kullanmak ve aramaktır grep, ancak bu her zaman kesin değildir

git log | grep <commit_id>

Kullanarak git branchverilen tüm dalları bulmak için doğrudan kullanmak daha iyidirCOMMIT_ID

git branch --contains $COMMIT_ID

Bir sonraki adım, git 1.8.1kullanıldığından beri yapılabilecek mevcut dalı bulmaktır.

git symbolic-ref --short HEAD

Ve birlikte

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

Ancak yukarıdaki komut doğru veya yanlış döndürmez ve taahhüt geçerli daldaysa çıkış kodu 0 döndüren VEYA değilse çıkış kodu 1 döndüren daha kısa bir sürüm vardır.

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

Çıkış kodu güzel, ancak dize trueveya falsecevap olarak biraz daha eklemeniz ve ardından ifbash ile birlikte

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

9
Bu doğru değil; grepeğer yanlış pozitif neden olabilir git logbu belirtilenlerin örneğin, başka nedenlerle SHA taahhüt başka şubesinden bir liman sonucunda iletiyi işlemek bahseder.
Adam Spires

1
Düzeltildi (veya başka bir seçenek eklendi).
JiriS

3
Lütfen yerleşik git araç setini kullanan soru hakkındaki açıklamaya bakın. stackoverflow.com/questions/43535132/…
Ben

2
İlk seçeneği seviyorum, ama Adem'in itirazını dışlamak için seçeneği --format=format:%Heklerdim git log.
PJSCopeland

71

Belirli bir taahhüdü içeren şubelerin bir listesini alın.

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

Bir şubenin belirli bir taahhüde sahip olup olmadığını kontrol edin.

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

Tam eşleşmeyle dalı (örneğin feature) arayın .

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

mesela sen 3 yerel dalları denilen varsa feature, feature1, feature2o zaman

$ git branch --contains <commit-id> | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

# output
feature     

Ayrıca hem arama yapabilir localve remotedalları (kullanım -a) ya da sadece remotedalları (kullanım -r).

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

# search in 'remote' branches  
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'

1
grepAdları da içeriyor taahhüt içeren diğer dalları varsa burada da yanlış pozitif sonuçlanabilecek <branch-name>bir alt dize olarak.
Adam Spires

1
@AdamSpiers, Şube ismini tam olarak eşleştirerek cevabı güncelledigrep -E '(^|\s)branchname$'
Sajib Khan

1
Başına ilgili soru üzerine bu yorumun da eklemek faydalı olabilir -r( "uzak") veya -a( "bütün") seçeneği git branchyerel repo klon çoğaltılamayacak olmayabilir dalları aramaya.
sxc731

Bu benim için işe yaramadı, ihtiyacım vardı git branch --all --contains <commit-id>
Arthur Tacca

7

@Torek tarafından cevap olarak yorum çıkarıldı:

Belirtilen bir taahhüdü içeren tüm dalları nasıl bulacağınız için önerilen kopyaya bakın.

Geçerli dalın C komutu içerip içermediğini öğrenmek için "sıhhi tesisat" komutunu kullanın git merge-base --is-ancestor. C, HEAD'in atasıysa mevcut dalda C bulunur, bu nedenle:

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

(Yan not: kabuk komut dosyalarında, sıfırdan çıkan bir komut "true" iken sıfırdan çıkan bir komut "false" olur.)


4

Taahhüt içeren yerel şubeleri listelemek için:

git branch --contains <commit-id>

ve yalnızca uzaktan kumanda dahil olmak üzere, taahhüt içeren tüm dalları listelemek için:

git branch -a --contains <commit-id>

Benzer şekilde, taahhüdün belirli bir branşta olup olmadığını kontrol etmek için:

git log <branch> | grep <commit_id>

ve şube yoksa yerel olarak şube adını önek origin/


Oylama için oy verdi -a. Bu tavsiye için teşekkürler!
Thorkil Værge

3

Evet başka bir alternatif:

git rev-list <branch name> | grep `git rev-parse <commit>`

Aynı zamanda gibi yerel olarak önbelleğe uzak dalları üzerinde çalışacak beri bu benim için en uygun remotes/origin/masterhangi, git branch --containsiş olmaz.

Bu OP'nin sadece "şu andaki dal" hakkındaki sorusunu fazlasıyla kapsıyor, ancak bu sorunun "herhangi bir dal" versiyonunu sormayı aptal buluyorum, bu yüzden yine de buraya göndermeye karar verdim.


1
git branch --contains <commit-id> --points-at <target branch name>

Bu dalda taahhüt kimliği varsa, hedef dal adını döndürür. Aksi takdirde komut başarısız olur.


hayır ...error: malformed object name 'branch-name'
bbodenmiller

1
Bu hatayı 2 durumda alabilirsiniz 1. Verilen <şube adı> verilen <taahhüt kimliği> 2'yi içermiyorsa <şube adı>
çıkışı

0

Bu sorunun bazı güzel scripty cevapları olduğundan favorilerimi ekliyorum.

Bu, şubelerin her birini içerdiği son $ntaahhütler için size gösterecektir $br:

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

Bu benzerdir ancak bir dallar listesi için de aynı şeyi yapar:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.