回答:
git rev-list --max-parents=0 HEAD
(からtihoさんのコメント。としてクリスヨンセン通知、--max-parents
この回答が掲載された後に導入されました。)
技術的には、複数のルートコミットが存在する場合があります。これは、以前は独立していた複数の履歴がマージされたときに発生します。これは、プロジェクトがサブツリーマージを介して統合される場合に一般的です。
git.git
リポジトリには、その歴史のグラフ(ライナスの最初のコミット、それぞれ1つずつで6つのルートコミットを持ってgitk、いくつかの最初は別々のツール、のgit-guiの、gitweb、とのgit-P4)。この場合、私e83c516
たちはそれがおそらく関心のあるものであることを知っています。これは、最も早いコミットとルートコミットの両方です。
一般的なケースではそれほど単純ではありません。
libfooがしばらくの間開発中で、その履歴をGitリポジトリーに保持していると想像してください(libfoo.git
)。独立して、「bar」プロジェクトも(bar.git
)で開発されていますが、libfoo(の最も古い日付libfoo.git
のコミットには、の最も早い日付のコミットよりも前の日付があります)はそうではありませんbar.git
。ある時点で、「bar」の開発者は、サブツリーマージを使用してlibfooをプロジェクトに組み込むことを決定します。このマージの前は、「最初の」コミットを判別するのは簡単なbar.git
ことでした(おそらく、ルートコミットは1つだけでした)。ただし、マージ後は複数のルートコミットがあり、最も古いルートコミットは実際にはlibfooの履歴からのものです。「バー」ではありません。
次のように、履歴DAGのすべてのルートコミットを見つけることができます。
git rev-list --max-parents=0 HEAD
記録のために、もし--max-parents
利用できなかったとしても、これはうまくいきます:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
便利なタグを配置している場合git name-rev
は、履歴の概要を簡単に確認できます。
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
これを頻繁に使用しますか?覚えにくい?迅速なアクセスのためにgitエイリアスを追加する
git config --global alias.first "rev-list --max-parents=0 HEAD"
今、あなたは単に行うことができます
git first
git rev-list --max-parents=0 HEAD
は同じことをすると信じており、少し簡単です。
見つけた:
git log --reverse
最初からコミットを表示します。
git log --reverse -5
、それ--reverse
を何らかの理由で無視します
ログを逆にして、最初の結果を表示するだけです。
git log --pretty=oneline --reverse | head -1
git log --reverse
履歴を元に戻すため、head -1
ではなくを使用しtail -1
て最初のコミットを取得する必要があります。
-n
ときにgitがフラグを無視しなかった場合に最適です--reverse
。
git log $(git log --pretty=format:%H|tail -1)
git log $(git log --reverse --pretty=format:%H|head -1)
git log -1
です。