「git log」で最初のコミットを表示するにはどうすればよいですか?


288

私には長い歴史を持つプロジェクトがあります。gitの最初のコミットを表示したいと思います。

どうすればよいですか?


2
私は最後を示す方法を見つけただけgit log -1です。
アレックス

回答:


298

短い答え

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

49
git rev-list --max-parents=0 HEADは同じことをすると信じており、少し簡単です。
tiho

3
@tiho:はい、同じことを行い、より簡単です。ただし、この質問/回答の時点では、そのオプションはまったく「発明」されていませんでした。
Chris Johnsen、2013年

最初のコミットはルートコミットよりもリーフコミットの方が多いと
思います

@tiho私はあなたの答えは単なるコメントではなくそれ自身の答えであるべきだと思います。そうすれば、それはより目立つようになり、多くの価値のあるポイントを獲得できます。
ラッセルシルバ

@RussellSilvaポイントは気にしませんが、他の人の回答を編集することは可能だと思います。新しい回答を追加するよりもおそらく良いでしょう。私は自分でやるのはあまり快適ではありませんが、お気軽に
どうぞ

414

見つけた:

git log --reverse

最初からコミットを表示します。


19
興味深いことにgit log --reverse -5、それ--reverseを何らかの理由で無視します
Dan2552

6
@ Dan2552バグのように見えますが、報告する必要がありますか?
saeedgnu 2013

23
最初に結果を5エントリに制限し、その後逆転するように見えます
非極性14

3
@太極者無極而生は正しい、それは文書化された動作です。
seriousdev

43

ログを逆にして、最初の結果を表示するだけです。

git log --pretty=oneline --reverse | head -1

7
git log --reverse履歴を元に戻すため、head -1ではなくを使用しtail -1て最初のコミットを取得する必要があります。
rubiii

4
が指定された-nときにgitがフラグを無視しなかった場合に最適です--reverse
Frederick Nord


6

それを行うための最も美しい方法ではないと思います:

git log --pretty=oneline | wc -l

これはあなたに番号を与えます

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1コミットハッシュ(つまり0dd89fb)を提供します。これは、次のようなことで他のコマンドにフィードできます

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD 最終日のすべてのコミットを表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.