Bagaimana cara membuat daftar cabang yang berisi komit yang diberikan?

1088

Bagaimana saya bisa meminta git untuk mencari tahu cabang mana yang berisi komit yang diberikan? gitkbiasanya akan mendaftar cabang, kecuali ada terlalu banyak, dalam hal ini hanya mengatakan "banyak (38)" atau sesuatu seperti itu. Saya perlu tahu daftar lengkapnya, atau setidaknya apakah cabang tertentu mengandung komit.

Andrew Arnott
sumber
Pertanyaan terkait untuk komit yang setara per komentar: stackoverflow.com/questions/16304574/...
UpAndAdam

Jawaban:

1471

Dari halaman manual git-branch :

 git branch --contains <commit>

Hanya daftar cabang yang berisi komit yang ditentukan (KEPALA jika tidak ditentukan). Tersirat --list.


 git branch -r --contains <commit>

Daftar cabang pelacakan jarak jauh juga (seperti yang disebutkan dalam jawaban user3941992 di bawah) yaitu "cabang lokal yang memiliki hubungan langsung dengan cabang jauh".


Lihat juga artikel git ready ini.

The --containstag akan mencari tahu apakah tertentu komit telah dibawa belum ke dalam cabang Anda. Mungkin Anda mendapat komit SHA dari patch yang Anda pikir telah Anda terapkan, atau Anda hanya ingin memeriksa apakah komit untuk proyek open source favorit Anda yang mengurangi penggunaan memori hingga 75% masih ada.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <[email protected]>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Catatan: jika komit ada di cabang pelacakan jarak jauh , tambahkan -aopsi .
(seperti komentar MichielB di bawah )

git branch -a --contains <commit>

MatrixFrog berkomentar bahwa itu hanya menunjukkan cabang yang berisi komit yang tepat .
Jika Anda ingin tahu cabang mana yang berisi komit "ekivalen" (mis. Cabang mana yang sudah memilih cherry yang komit) itu git cherry:

Karena git cherry membandingkan perubahan yang dilakukan daripada id komit (sha1) , Anda dapat menggunakan git cherryuntuk mengetahui apakah komit yang Anda buat secara lokal telah diterapkan di <upstream>bawah id komit yang berbeda.
Misalnya, ini akan terjadi jika Anda memberi makan tambalan <upstream>melalui email daripada mendorong atau menarik komitmen secara langsung.

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

(Di sini, komit bertanda ' -' tidak akan muncul git cherry, artinya sudah ada <upstream>.)

VONC
sumber
3
testsdan master- masteradalah cabang saat ini, oleh karena itu tanda bintang.
blueyed
54
Ini hanya menunjukkan cabang mana yang berisi komit yang tepat . Jika Anda ingin mengetahui cabang mana yang berisi komit "ekivalen" (mis. Cabang mana yang telah memetik komit), itu adalah git cherry: "Karena git ceri membandingkan perubahan daripada komit (sha1), Anda bisa menggunakan git ceri untuk mencari tahu jika komit yang Anda buat secara lokal telah diterapkan <upstream> di bawah id komit yang berbeda. Misalnya, ini akan terjadi jika Anda memberi makan tambalan <upstream> melalui email daripada mendorong atau menarik komit secara langsung. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog
62
Tambahkan -aparameter untuk juga memeriksa cabang jarak jauh.
Raman
28
Anda juga bisa melakukannya git tag --contains <commit>. Lihat Mencari semua tag yang mengandung komit? .
Andrew Marshall
5
Untuk git cherrybagian @UpAndAdam mengajukan pertanyaan di sini: stackoverflow.com/questions/16304574/… , sayangnya, pertanyaannya belum dijawab.
adeelx
22

Anda dapat menjalankan:

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

Dari komentar komit terakhir dalam output, Anda dapat menemukan nama cabang asli

Contoh:

       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
Eugen Konkov
sumber
6
Bagus! Saya biasa git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1mendapatkan ini dalam satu baris
James EJ
1
Jika Anda ingin menggunakan perintah git murni, Anda dapat menggunakan:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz
Catatan: Ketika komit Anda adalah komit terbaru di cabang master / foo (KEPALA) ... Anda tidak dapat A..Bmelakukan rentang komit, hanya saja jangan gunakan rentang seperti begitu :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode
Jika repo git ini adalah submodule dan Anda mencoba untuk memecahkan masalah HEAD terpisah ... maka Anda memiliki pertanyaan sulit tentang cabang pilihan ... Dalam contoh saya sebelumnya, Anda dapat dengan mudah mengatakan bahwa masterselalu lebih disukai jika ada dalam daftar ini . Dari situ kurang jelas. Anda bisa mencoba dan membaca cabang git dari file .gitmodules: git config -f .gitmodules submodule.src/foo/submodule.branch. Ini bisa menjadi fork / pr lama berdiri. Anda dapat cd untuk melakukan repo root dan menjalankan git config submodule.src/foo/submodule.branch. Anda juga dapat menggunakan cabang git superprojects saat ini.
Devin G Rhode
Sebagai tambahan kecil: git config submodule.src/foo/submodule.branchDapat dipengaruhi oleh berbagai konfigurasi git, termasuk file .gitconfig repo-lokal. (wajib berlari git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode