Bagaimana cara menunjukkan komit pertama dengan 'git log'?

288

Saya punya proyek yang memiliki sejarah panjang. Saya ingin menunjukkan komit pertama pada git.

Bagaimana saya melakukan ini?

Nyambaa
sumber
2
Saya hanya menemukan cara untuk menunjukkan yang terakhir git log -1.
alex
5
kemungkinan duplikat git: bagaimana cara merujuk komit awal?
Chris Johnsen

Jawaban:

298

Jawaban singkat

git rev-list --max-parents=0 HEAD

(dari komentar tiho . Seperti pemberitahuan Chris Johnsen , --max-parentsdiperkenalkan setelah jawaban ini diposting.)

Penjelasan

Secara teknis, mungkin ada lebih dari satu root commit. Ini terjadi ketika beberapa riwayat yang sebelumnya independen digabung bersama. Adalah umum ketika sebuah proyek diintegrasikan melalui gabungan subtree .

The git.gitrepositori memiliki enam komit akar dalam grafik sejarahnya (masing-masing untuk Linus awal komit, gitk , beberapa alat awalnya terpisah, git-gui , gitweb , dan git-p4 ). Dalam hal ini, kita tahu bahwa e83c516itulah yang mungkin menarik bagi kita. Ini adalah komit awal dan komit root.

Ini tidak begitu sederhana dalam kasus umum.

Bayangkan libfoo telah dikembangkan untuk sementara waktu dan menyimpan sejarahnya di repositori Git ( libfoo.git). Secara independen, proyek "bar" juga sedang dikembangkan (dalam bar.git), tetapi tidak selama libfoo (komitmen dengan tanggal paling awal di libfoo.gitmemiliki tanggal yang mendahului komitmen dengan tanggal paling awal di bar.git). Pada titik tertentu, pengembang "bar" memutuskan untuk memasukkan libfoo ke dalam proyek mereka dengan menggunakan gabungan subtree. Sebelum penggabungan ini, mungkin sepele untuk menentukan komit “pertama” bar.git(mungkin hanya ada satu komit root). Setelah penggabungan, bagaimanapun, ada beberapa komit root dan komit root paling awal sebenarnya berasal dari sejarah libfoo, bukan "bar".

Anda dapat menemukan semua root commit dari DAG sejarah seperti ini:

git rev-list --max-parents=0 HEAD

Sebagai catatan, jika --max-parentstidak tersedia, ini juga berfungsi:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Jika Anda memiliki tag yang berguna di tempat, maka git name-revmungkin memberi Anda gambaran singkat tentang sejarah:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

Bonus

Gunakan ini sering? Sulit diingat? Tambahkan alias git untuk akses cepat

git config --global alias.first "rev-list --max-parents=0 HEAD"

Sekarang Anda bisa melakukannya

git first
Chris Johnsen
sumber
49
Saya percaya git rev-list --max-parents=0 HEADakan melakukan hal yang sama, dan sedikit lebih sederhana.
tiho
3
@tiho: Ya, ia melakukan hal yang sama, dan lebih sederhana; meskipun pilihan itu belum “diciptakan” pada saat pertanyaan / jawaban ini.
Chris Johnsen
Terjadi pada saya bahwa komit pertama lebih dari komit daun daripada komit akar
tiwo
@tiho Saya pikir jawaban Anda harus jawabannya sendiri dan bukan hanya komentar. Dengan begitu itu akan lebih menonjol dan Anda akan mendapatkan poin yang sangat layak.
Russell Silva
@RussellSilva Saya tidak peduli tentang poin, tapi saya percaya mungkin untuk mengedit jawaban orang lain, yang mungkin akan lebih baik daripada menambahkan yang baru. Saya tidak benar-benar nyaman melakukannya sendiri, jangan ragu untuk melakukannya :)
tiho
414

Saya menemukan bahwa:

git log --reverse

menunjukkan komitmen dari awal.

Nyambaa
sumber
19
Menariknya git log --reverse -5membuatnya mengabaikan --reversebeberapa alasan
Dan2552
6
@ Dan2552 Sepertinya ada bug, harus dilaporkan?
saeedgnu
23
Sepertinya itu pertama membatasi hasil hingga 5 entri, dan kemudian membalikkan
nonopolaritas
3
@ 太極 者 無極 而 生 benar, itu adalah perilaku yang terdokumentasi.
seriousdev
43

Anda bisa membalikkan log Anda dan langsung menuju untuk hasil pertama.

git log --pretty=oneline --reverse | head -1
Mohamed Mansour
sumber
7
git log --reversemembalikkan riwayat, jadi Anda harus menggunakan head -1alih-alih tail -1mendapatkan komit pertama.
rubiii
4
akan lebih baik jika git tidak mengabaikan -nbendera ketika --reversediberikan.
Frederick Nord
12
git log $(git log --pretty=format:%H|tail -1)
Matthew Flaschen
sumber
1
ataugit log $(git log --reverse --pretty=format:%H|head -1)
nonopolaritas
bantu saya. nyata "komit pertama"
kangear
6

Kurasa bukan cara yang paling indah untuk melakukannya:

git log --pretty=oneline | wc -l

Ini memberi Anda nomor itu

git log HEAD~<The number minus one>
MHC
sumber
1

git log --format="%h" | tail -1memberi Anda hash komit (yaitu 0dd89fb), yang dapat Anda beri makan ke perintah lain, dengan melakukan sesuatu seperti

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD untuk melihat semua komitmen di hari terakhir.

TankorSmash
sumber