Belirli bir taahhüt içeren şubeler nasıl listelenir?


1087

Hangi şubelerin belirli bir taahhüt içerdiğini bulmak için git'i nasıl sorgulayabilirim? gitkçok fazla olmadığı sürece genellikle dalları listeleyecektir, bu durumda sadece "çok (38)" veya bunun gibi bir şey söylüyor. Tam listeyi veya en azından belirli şubelerin taahhüdü içerip içermediğini bilmem gerekiyor.



Yorum başına eşdeğer bir taahhüt için ilgili soru: stackoverflow.com/questions/16304574/…
UpAndAdam

Yanıtlar:


1470

Gönderen git-şube manuel sayfa :

 git branch --contains <commit>

Yalnızca belirtilen taahhüdü içeren dalları (belirtilmemişse HEAD) listeleyin. İma eder --list.


 git branch -r --contains <commit>

Listeler uzak dalları izleme (belirtildiği gibi user3941992 'ın cevabı 'Uzak bir dalına doğrudan bir ilişki var yerel şubeleri' dır aşağıda).


Ayrıca bu git hazır makalesine bakın.

--containsBelli bir şubenizdeki içine henüz dava açılmış bir kesinleştirme eğer etiket anlamaya olacaktır. Belki de uyguladığınızı düşündüğünüz bir yamadan bir taahhütlü SHA'nız var ya da sadece bellek kullanımını% 75 oranında azaltan en sevdiğiniz açık kaynak projeniz için taahhütlerin olup olmadığını kontrol etmek istiyorsunuz.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Not: taahhüt uzak izleme dalındaysa , -aseçeneği ekleyin .
(aynı MichielB yorumlar aşağıda )

git branch -a --contains <commit>

MatrixFrog , yalnızca hangi dalların bu kesin taahhüdü içerdiğini gösterdiğini yorumlar .
Hangi dalların "eşdeğer" bir taahhüt içerdiğini bilmek istiyorsanız (yani hangi şubelerin bu taahhüdü kiraz aldı) git cherry:

Çünkü git cherry kimliği (sha1) işlemek yerine changeset karşılaştırır , kullanabileceğiniz git cherrybir yerel olarak uygulanmıştır yapılan taahhüt olmadığını öğrenmek için <upstream>farklı bir altında kimliği işlemek.
Örneğin, yamaları <upstream>doğrudan itmek veya çekmek yerine e-posta ile besliyorsanız bu olur .

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(Burada, ' -' işaretli taahhütler görünmez git cherry, yani zaten mevcutlar <upstream>.)


3
testsve master- mastergeçerli dal, bu nedenle yıldız işareti.
31'de blueyed

54
Bu sadece hangi dalların bu kesin taahhüdü içerdiğini gösterir . Hangi dalların "eşdeğer" bir taahhüt içerdiğini bilmek istiyorsanız (yani hangi şubeler bu taahhüdü seçti) git cherry: "Git cherry, taahhüt kimliği (sha1) yerine değişiklik kümesini karşılaştırdığından, bulmak için git cherry'i kullanabilirsiniz. yerel olarak yaptığınız bir taahhüt farklı bir taahhüt kimliği altında <upstream> uygulanmışsa. Örneğin, doğrudan taahhütleri itmek veya çekmek yerine <upstream> yamalarını e-posta ile besliyorsanız bu gerçekleşir. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog

62
-aUzak dalları da kontrol etmek için bir parametre ekleyin .
Raman

28
Siz de yapabilirsiniz git tag --contains <commit>. Bkz işaretini içerir taahhüt tüm etiketler için arıyorsunuz? .
Andrew Marshall

5
İçin git cherryparçası @UpAndAdam burada soru soruldu: stackoverflow.com/questions/16304574/... , ne yazık ki, soru (henüz) cevap edilmemiştir.
adeelx

22

Çalıştırabilirsiniz:

git log <SHA1>..HEAD --ancestry-path --merges

Çıktıdaki son işlemin yorumundan orijinal şube adını bulabilirsiniz

Misal:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

6
Güzel! Bunu git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1bir satırda
alırdım

1
Pure git komutunu kullanmak isterseniz, aşağıdakileri kullanabilirsiniz:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz

Not: Taahhüdünüz ana / foo dalında (HEAD) en son taahhüt olduğunda ... bir A..Btaahhüt aralığı yapamazsınız , sadece böyle bir aralığı kullanmayın :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode

Bu git repo bir alt modülse ve ayrılmış HEAD problemini çözmeye çalışıyorsanız ... o zaman tercih edilen bir dalla ilgili zor bir sorunuz var ... Önceki örneğimde bunu kolayca söyleyebilirsiniz master , bu listede varsa her zaman tercih . Oradan daha az net. Sen denemek ve .gitmodules dosyadan git şube okuyabilir: git config -f .gitmodules submodule.src/foo/submodule.branch. Bu uzun süredir devam eden bir çatal / pr olabilir. Kök repo ve çalıştırmak için cd yapabilirsiniz git config submodule.src/foo/submodule.branch. Süper projelerin geçerli git dalını da kullanabilirsiniz.
Devin G Rhode

Küçük bir kenara: git config submodule.src/foo/submodule.branchRepo-yerel .gitconfig dosyası da dahil olmak üzere herhangi bir git yapılandırmalarından etkilenebilir. (koşmayı gerektirir git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode
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.