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:
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 :)
git log -1
.Jawaban:
Jawaban singkat
(dari komentar tiho . Seperti pemberitahuan Chris Johnsen ,
--max-parents
diperkenalkan 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.git
repositori 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 bahwae83c516
itulah 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 (dalambar.git
), tetapi tidak selama libfoo (komitmen dengan tanggal paling awal dilibfoo.git
memiliki tanggal yang mendahului komitmen dengan tanggal paling awal dibar.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:
Sebagai catatan, jika
--max-parents
tidak tersedia, ini juga berfungsi:Jika Anda memiliki tag yang berguna di tempat, maka
git name-rev
mungkin memberi Anda gambaran singkat tentang sejarah:Bonus
Gunakan ini sering? Sulit diingat? Tambahkan alias git untuk akses cepat
Sekarang Anda bisa melakukannya
sumber
git rev-list --max-parents=0 HEAD
akan melakukan hal yang sama, dan sedikit lebih sederhana.Saya menemukan bahwa:
menunjukkan komitmen dari awal.
sumber
git log --reverse -5
membuatnya mengabaikan--reverse
beberapa alasanAnda bisa membalikkan log Anda dan langsung menuju untuk hasil pertama.
sumber
git log --reverse
membalikkan riwayat, jadi Anda harus menggunakanhead -1
alih-alihtail -1
mendapatkan komit pertama.-n
bendera ketika--reverse
diberikan.sumber
git log $(git log --reverse --pretty=format:%H|head -1)
Kurasa bukan cara yang paling indah untuk melakukannya:
Ini memberi Anda nomor itu
sumber
git log --format="%h" | tail -1
memberi Anda hash komit (yaitu0dd89fb
), yang dapat Anda beri makan ke perintah lain, dengan melakukan sesuatu sepertigit diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
untuk melihat semua komitmen di hari terakhir.sumber