Perintah shell berikut harus melakukan apa yang Anda inginkan:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Peringatan
Jika Anda telah mybranchmemeriksa, perintah di atas tidak akan berfungsi. Itu karena komit mybranchjuga dapat dijangkau HEAD, jadi Git tidak menganggap komit itu unik mybranch. Agar berfungsi saat mybranchdicentang, Anda juga harus menambahkan pengecualian untuk HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Namun, Anda tidak boleh mengecualikan HEADkecuali mybranchdiperiksa, jika tidak Anda berisiko menunjukkan komitmen yang tidak eksklusif untukmybranch .
Demikian pula, jika Anda memiliki cabang jarak jauh bernama origin/mybranchyang sesuai dengan mybranchcabang lokal , Anda harus mengecualikannya:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
Dan jika cabang jarak jauh adalah cabang default untuk repositori jarak jauh (biasanya hanya berlaku untuk origin/master), Anda juga harus mengecualikan origin/HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Jika cabang Anda dicentang, dan ada cabang jarak jauh, dan cabang jarak jauh adalah default untuk repositori jarak jauh, maka Anda akhirnya tidak termasuk banyak:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Penjelasan
The git rev-listperintah adalah tingkat rendah (pipa) perintah yang berjalan revisi yang diberikan dan kesedihan pengidentifikasi SHA1 ditemui. Anggap itu setara dengangit log kecuali hanya menunjukkan SHA1 — tidak ada pesan log, tidak ada nama penulis, tidak ada cap waktu, tidak ada yang "mewah".
The --no-walkpilihan, seperti namanya, mencegah git rev-listdari berjalan rantai keturunan. Jadi, jika Anda mengetiknya git rev-list --no-walk mybranchhanya akan mencetak satu pengidentifikasi SHA1: pengenal komit ujung mybranchcabang.
The --exclude=refs/heads/mybranch --allargumen memberitahu git rev-listmulai dari setiap referensi kecuali refs/heads/mybranch.
Jadi, ketika Anda menjalankan git rev-list --no-walk --exclude=refs/heads/mybranch --all, Git mencetak pengidentifikasi SHA1 dari komit tip dari masing-masing referensi kecuali untuk refs/heads/mybranch. Ini komit dan nenek moyang mereka adalah komit Anda tidak tertarik-ini komit Anda lakukan tidak ingin Anda lihat.
The lainnya komit adalah orang-orang yang ingin Anda lihat, jadi kami mengumpulkan output dari git rev-list --no-walk --exclude=refs/heads/mybranch --alldan memberitahu Git untuk menunjukkan segala sesuatu tetapi mereka komit dan nenek moyang mereka.
Itu --no-walk Argumen diperlukan untuk repositori besar (dan optimasi untuk repositori kecil): Tanpa itu, Git akan harus mencetak, dan shell akan harus mengumpulkan (dan simpan dalam memori) lebih banyak melakukan pengidentifikasi dari yang diperlukan. Dengan repositori besar, jumlah komit yang dikumpulkan dapat dengan mudah melebihi batas argumen baris perintah shell.
Git bug?
Saya berharap yang berikut ini berfungsi:
git log --all --not --exclude=refs/heads/mybranch --all
tetapi tidak. Saya menduga ini adalah bug di Git, tapi mungkin itu disengaja.