Diberikan komit id, bagaimana untuk mengetahui jika saat ini cabang berisi komit?

Apa yang saya'm mencoba untuk lakukan adalah cek versi. Saya ingin memastikan kode tetap di atas versi minimum. Jadi saya perlu cara untuk mengetahui jika saat ini cabang berisi ditentukan komit.

Mengomentari pertanyaan (6)
Larutan

Ada beberapa cara untuk mencapai hasil ini. Pertama naif pilihan adalah dengan menggunakan git log dan buku tertentu komit menggunakan grep, tapi itu tidak selalu tepat

git log | grep 

Anda akan lebih baik untuk menggunakan git branchlangsung untuk menemukan semua cabang yang mengandung diberikanCOMMIT_ID` menggunakan

git branch --contains $COMMIT_ID

Langkah berikutnya adalah mencari tahu saat ini cabang yang dapat dilakukan sejak git 1.8.1 menggunakan

git symbolic-ref --short HEAD

Dan digabungkan bersama-sama sebagai

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

Tapi perintah di atas doesn't return true atau false, dan ada versi yang lebih pendek yang kembali keluar kode 0 jika melakukan ini di saat ini cabang ATAU keluar kode 1 jika tidak

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

Kode keluar bagus, tapi seperti yang anda inginkan string true atau false sebagai jawaban yang anda butuhkan untuk menambahkan sedikit lebih banyak dan kemudian dikombinasikan dengan jika dari bash anda dapatkan

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

Dapatkan daftar branch(es) yang berisi spesifik komit.

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

Memeriksa apakah suatu cabang tertentu yang melakukan.

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

Pencarian cabang (katakanlah, fitur) dengan pencocokan tepat.

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

misalnya Jika anda memiliki 3 cabang lokal yang disebut tidur, fitur1, feature2 kemudian

$ git branch --contains  | grep 'feature'

# output
feature
feature1
feature2

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

# output
feature     

Anda juga dapat mencari di kedua lokal dan remote cabang (gunakan -a) atau hanya di remote cabang (gunakan -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$'
Komentar (3)

Diekstrak komentar oleh @torek sebagai jawaban:

Melihat diusulkan duplikat untuk bagaimana untuk menemukan semua cabang yang mengandung ditentukan komit.

Untuk mengetahui apakah saat ini ** branch berisi komit C, gunakan "pipa" perintah git merge-dasar-adalah-nenek moyang`. Saat ini cabang yang berisi C jika C adalah nenek moyang dari KEPALA, sehingga:

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

(Catatan: dalam skrip shell, perintah yang keluar nol adalah "benar" sementara yang keluar bukan nol adalah "salah".)

Komentar (0)

Ya alternatif lain: git rev-daftar <nama cabang> | grep `git rev-mengurai <melakukan>` Ini bekerja terbaik bagi saya karena hal ini juga akan bekerja pada cache lokal remote cabang seperti remote/asal/master, di mana git branch --mengandung tidak't bekerja.

Ini mencakup lebih dari OP's pertanyaan tentang "saat ini cabang" tapi saya merasa bodoh untuk bertanya "setiap cabang" versi dari pertanyaan ini jadi saya memutuskan untuk posting di sini pula.

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

Itu akan kembali target cabang nama jika komit id ada di cabang itu. Jika perintah akan gagal.

Komentar (2)

Karena pertanyaan ini memiliki beberapa nice scripty jawaban, aku'm menambahkan favorit saya.

Yang satu ini akan menunjukkan kepada anda, untuk yang terakhir $n melakukan $br yang berisi masing-masing cabang:

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

Ini serupa tetapi tidak sama untuk daftar cabang:

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
Komentar (0)