Saya ingin membuat daftar semua komitmen yang hanya merupakan bagian dari cabang tertentu.
Dengan berikut ini, daftar semua komit dari cabang, tetapi juga dari induk (master)
git log mybranch
Pilihan lain yang saya temukan, adalah untuk mengecualikan komit yang dapat dijangkau oleh master dan memberi saya apa yang saya inginkan, TETAPI saya ingin menghindari kebutuhan untuk mengetahui nama cabang lainnya.
git log mybranch --not master
Saya mencoba menggunakan git for-each-ref
, tetapi juga mencantumkan mybranch jadi sebenarnya tidak termasuk semua:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Memperbarui:
Saya sedang menguji opsi baru yang saya temukan beberapa waktu lalu, dan sampai sekarang sepertinya ini yang bisa saya cari:
git log --walk-reflogs mybranch
Pembaruan (2013-02-13T15: 08):
Opsi --walk-reflogs baik, tetapi saya memeriksa bahwa ada kadaluwarsa untuk reflog (default 90 hari, gc.reflogExpire ).
Saya pikir saya menemukan jawaban yang saya cari:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Saya hanya menghapus cabang saat ini dari daftar cabang yang tersedia dan menggunakan daftar itu untuk dikeluarkan dari log. Dengan cara ini saya hanya mendapatkan komitmen yang hanya dapat dicapai oleh kantor saya .
Jawaban:
Dari sepertinya Anda harus menggunakan
cherry
:Ini akan menunjukkan semua komitmen yang terkandung dalam mybranch , tetapi TIDAK dalam pengembangan . Jika Anda meninggalkan opsi terakhir ( mybranch ), itu akan membandingkan cabang saat ini sebagai gantinya.
Seperti yang ditunjukkan VonC, Anda SELALU membandingkan cabang Anda dengan cabang lain, jadi ketahui cabang Anda dan kemudian pilih yang mana untuk dibandingkan.
sumber
git cherry -v master
dapat membandingkan cabang saat ini dengan cabang master.fatal: Unknown commit mybranch
.Saya rasa ini tidak mungkin: cabang di Git selalu didasarkan pada yang lain atau setidaknya pada komit lain, seperti yang dijelaskan dalam " git diff tidak cukup menunjukkan ":
Anda memerlukan titik referensi untuk log Anda untuk menunjukkan komitmen yang tepat.
Seperti disebutkan dalam " GIT - Di mana saya cabang? ":
Jadi, bahkan jika
git log master..mybranch
satu jawaban, itu masih akan menunjukkan terlalu banyak komitmen, jikamybranch
didasarkan padamyotherbranch
, itu sendiri berdasarkanmaster
.Untuk menemukan referensi itu (asal cabang Anda), Anda hanya dapat menguraikan komit dan melihat di cabang mana mereka, seperti yang terlihat di:
sumber
Saya akhirnya menemukan cara untuk melakukan apa yang diinginkan OP. Sesederhana:
Perintah akan menampilkan semua komit yang dapat dijangkau dari cabang yang disediakan dalam format grafik. Tetapi, Anda dapat dengan mudah memfilter semua komit pada cabang itu dengan melihat grafik komit yang
*
merupakan karakter pertama di baris komit.Sebagai contoh, mari kita lihat kutipan
git log --graph master
repo GitHub di cakephp di bawah ini:Seperti yang Anda lihat, hanya komit
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
danc3f45e811e4b49fe27624b57c3eb8f4721a4323b
memiliki*
karakter pertama di garis komit. Komit-komit itu berasal dari cabang utama sedangkan empat lainnya dari beberapa cabang lain.sumber
Perintah shell berikut harus melakukan apa yang Anda inginkan:
Peringatan
Jika Anda telah
mybranch
memeriksa, perintah di atas tidak akan berfungsi. Itu karena komitmybranch
juga dapat dijangkauHEAD
, jadi Git tidak menganggap komit itu unikmybranch
. Agar berfungsi saatmybranch
dicentang, Anda juga harus menambahkan pengecualian untukHEAD
:Namun, Anda tidak boleh mengecualikan
HEAD
kecualimybranch
diperiksa, jika tidak Anda berisiko menunjukkan komitmen yang tidak eksklusif untukmybranch
.Demikian pula, jika Anda memiliki cabang jarak jauh bernama
origin/mybranch
yang sesuai denganmybranch
cabang lokal , Anda harus mengecualikannya:Dan jika cabang jarak jauh adalah cabang default untuk repositori jarak jauh (biasanya hanya berlaku untuk
origin/master
), Anda juga harus mengecualikanorigin/HEAD
: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:
Penjelasan
The
git rev-list
perintah 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-walk
pilihan, seperti namanya, mencegahgit rev-list
dari berjalan rantai keturunan. Jadi, jika Anda mengetiknyagit rev-list --no-walk mybranch
hanya akan mencetak satu pengidentifikasi SHA1: pengenal komit ujungmybranch
cabang.The
--exclude=refs/heads/mybranch --all
argumen memberitahugit rev-list
mulai dari setiap referensi kecualirefs/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 untukrefs/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 --all
dan 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:
tetapi tidak. Saya menduga ini adalah bug di Git, tapi mungkin itu disengaja.
sumber
hg log -b <branch>
. Saya tidak mengerti mengapa orang mengatakan git tidak ramah. / sgit log --all --not --exclude=refs/heads/mybranch --all
tidak berhasil tetapigit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
tidak, dengan peringatan yang sama tentang mengecualikan KEPALA dan asal.Jawaban cepat:
Katakanlah:
Bahwa Anda memiliki cabang utama
Lakukan beberapa komitmen
Anda membuat cabang bernama b2
Lakukan
git log -n1
; komit Id adalah basis gabungan antara b2 dan masterLakukan beberapa komit di b2
git log
akan menampilkan riwayat log Anda dari b2 dan masterGunakan rentang komit, jika Anda tidak terbiasa dengan konsep ini, saya mengundang Anda ke google atau menumpuknya melimpah,
Untuk konteks aktual Anda, Anda dapat melakukannya misalnya
".." adalah operator jangkauan untuk perintah log.
Itu artinya, dalam bentuk sederhana, beri saya semua log lebih baru daripada commitID_FOO ...
Lihat pada titik # 4, basis gabungan
Jadi:
git log COMMITID_mergeBASE..HEAD
akan menunjukkan perbedaannyaGit dapat mengambil basis gabungan untuk Anda seperti ini
Akhirnya Anda bisa melakukannya:
sumber
Anda dapat mencoba sesuatu seperti ini:
Atau, meminjam dari resep dalam Panduan Pengguna Git :
sumber
git show-ref --tags
juga.akan mencantumkan tip dari setiap cabang yang tidak
master
.akan mencantumkan setiap komit dalam
master
sejarah yang tidak ada dalam sejarah cabang lain.Urutan penting untuk opsi yang mengatur pipa filter untuk pemilihan komit, jadi
--branches
harus mengikuti pola pengecualian apa pun yang seharusnya diterapkan, dan--no-walk
harus mengikuti filter yang memasok komit rev-list tidak boleh berjalan.sumber
Ini akan menampilkan komit pada cabang saat ini. Jika ada argumen yang dilewatkan, itu hanya menghasilkan hash.
git_show_all_commits_only_on_this_branch
sumber
Saya menggunakan perintah berikut:
atau
sumber
Saya menemukan pendekatan ini relatif mudah.
Checkout ke cabang dan dari
Lari
Ini hanya akan menyediakan dua SHA:
1) komit terakhir dari cabang [C1]
2) dan komit induk ke komit pertama cabang [C2]
Sekarang jalankan
Di sini C1 dan C2 adalah dua string yang akan Anda dapatkan ketika Anda menjalankan perintah pertama. Masukkan nilai-nilai ini tanpa <> dalam perintah kedua.
Ini akan memberikan daftar riwayat perubahan file dalam cabang.
sumber
Dalam situasi saya, kami menggunakan Git Flow dan GitHub. Yang perlu Anda lakukan adalah: Bandingkan cabang fitur Anda dengan cabang pengembangan Anda di GitHub.
Ini akan menunjukkan komit yang hanya dibuat untuk cabang fitur Anda.
Sebagai contoh:
https://github.com/your_repo/compare/develop...feature_branch_name
sumber
git
dan alih-alih menggunakan GitHub untuk hanya membuat permintaan tarikan atau membandingkan cabang.