Saya punya proyek yang memiliki sejarah panjang. Saya ingin menunjukkan komit pertama pada git.
Bagaimana saya melakukan ini?
Saya punya proyek yang memiliki sejarah panjang. Saya ingin menunjukkan komit pertama pada git.
Bagaimana saya melakukan ini?
Jawaban:
git rev-list --max-parents=0 HEAD
(dari komentar tiho . Seperti pemberitahuan Chris Johnsen , --max-parentsdiperkenalkan setelah jawaban ini diposting.)
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
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
git rev-list --max-parents=0 HEADakan melakukan hal yang sama, dan sedikit lebih sederhana.
Saya menemukan bahwa:
git log --reverse
menunjukkan komitmen dari awal.
git log --reverse -5membuatnya mengabaikan --reversebeberapa alasan
Anda bisa membalikkan log Anda dan langsung menuju untuk hasil pertama.
git log --pretty=oneline --reverse | head -1
git log --reversemembalikkan riwayat, jadi Anda harus menggunakan head -1alih-alih tail -1mendapatkan komit pertama.
-nbendera ketika --reversediberikan.
git log $(git log --pretty=format:%H|tail -1)
git log $(git log --reverse --pretty=format:%H|head -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.
git log -1.