Bagaimana cara mendapatkan histori komit hanya untuk satu cabang?


128

Katakanlah saya membuat cabang baru my_experimentdari masterdan membuat beberapa komitmen my_experiment. Jika saya lakukan git logketika dinyalakan my_experiment, saya melihat komit dibuat untuk cabang ini, tetapi juga komit dibuat mastersebelum my_experimentscabang dibuat.

Saya akan merasa sangat berguna untuk melihat sejarah semua komitmen terhadap my_experimentscabang sampai menyentuh cabang itu - secara efektif sejarah sejati dari cabang itu saja. Kalau tidak, tidak jelas bagi saya ketika melihat melalui log apakah komit berada di my_experimentscabang atau tidak.

Apakah ada cara untuk melakukan ini dengan Git?

Jawaban:


139

Anda dapat menggunakan rentang untuk melakukan itu.

git log master..

Jika Anda sudah memeriksa my_experimentcabang Anda . Ini akan membandingkan di mana masterdi HEAD(ujung my_experiment).


3
Ok berbicara terlalu cepat. Itu berhasil untuk contoh sederhana saya. Tapi sekarang saya sedang melihat repo nyata orang lain dan saya sadar bahwa untuk menggunakan perintah ini dengan benar, saya perlu tahu dari cabang mana cabang saya saat ini dibuat. Mungkin saya harus bisa mengatakan ini dari gitk tetapi tidak jelas bagi saya. Adakah pikiran?
Marplesoft

@ Marsplesoft Mungkin rumit untuk mengetahuinya. Lihat pertanyaan ini .
alex

Bisakah Anda jelaskan secara singkat bagaimana cara kerjanya? Apa yang git log master..diceritakan pada Git?
tonix

2
@tonix Ikuti tautan dalam jawaban untuk informasi lebih lanjut tentang cara kerja rentang (themaster.. ).
alex

7

The git merge-baseperintah dapat digunakan untuk menemukan nenek moyang yang sama. Jadi jika my_experiment belum digabungkan menjadi master dan my_experiment telah dibuat dari master, Anda dapat:

git log --oneline `git merge-base my_experiment master`..my_experiment

Jika Anda ingin menyertakan induk dari komit pertama Anda, tambahkan ^ dan --first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie

7

Catatan: jika Anda membatasi log itu ke n komit terakhir (3 komit terakhir misalnya, git log -3), pastikan untuk memberi spasi antara 'n' dan cabang Anda:

git log -3 master..

Sebelum Git 2.1 (Agustus 2014), kesalahan ini: git log -3master..sebenarnya akan menunjukkan kepada Anda 3 komit terakhir dari cabang saat ini (di sini my_experiment), mengabaikan masterbatas (artinya jika my_experimenthanya mengandung satu komit, 3 masih akan terdaftar, 2 di antaranya dari master)

Lihat commit e3fa568 oleh Junio ​​C Hamano ( gitster) :

revisi: parse " git log -<count>" lebih hati-hati

Baris perintah yang salah ketik ini hanya mengabaikan " master" dan akhirnya menampilkan dua commit dari saat ini HEAD:

$ git log -2master

karena kami memberi makan " 2master" atoi()tanpa memastikan bahwa seluruh string diuraikan sebagai integer.

Gunakan strtol_i()fungsi helper sebagai gantinya.


1

Anda hanya bisa menggunakan git log --oneline


Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
DebanjanB

1

Saya pikir opsi untuk tujuan Anda adalah git log --online --decorate . Ini memungkinkan Anda mengetahui komit yang dicentang, dan komit teratas untuk setiap cabang yang Anda miliki dalam alur cerita Anda. Dengan melakukan ini, Anda memiliki pandangan yang bagus tentang struktur repo Anda dan komitmen yang terkait dengan cabang tertentu. Saya pikir membaca ini mungkin membantu.


0

Saya tahu ini sudah sangat terlambat untuk ini ... Tapi di sini ada satu (tidak begitu sederhana) oneliner untuk mendapatkan apa yang Anda cari:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Kami mendaftarkan komit dengan nama cabang dan posisi relatif ke status cabang aktual dengan git show-branch(mengirim peringatan ke/dev/null ).
  • Maka kita hanya menyimpannya dengan nama cabang kita di dalam braket grep -E "\[$BRANCH_NAME" .
  • Di mana sebenarnya $BRANCH_NAMEdiperoleh dengan git branch | grep -E '^\*' | awk '{ printf $2 }'(cabang dengan bintang, bergema tanpa bintang itu).
  • Dari hasil kami, kami menghapus garis redundan di awal dengan tail -n+2.
  • Dan kemudian, kita fianlly membersihkan output dengan menghapus segala sesuatu sebelumnya [$BRANCH_NAME]dengan sed -E "s/^[^\[]*?\[/[/".
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.