1. ホーム
  2. git

[解決済み] git log'でファーストコミットを表示するには?

2022-03-14 05:59:05

質問

私は長い歴史を持つプロジェクトを持っています。git上の最初のコミットを表示したいのですが。

どうすればいいですか?

どのように解決するのですか?

簡単な答え

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

<サブ から tihoさんのコメント . として クリス・ジョンセンからのお知らせ , --max-parents はこの回答が投稿された後に導入されたものです)。

説明

技術的には、ルートコミットは1つ以上存在する可能性があります。これは、以前は独立していた複数の履歴がマージされたときに起こります。これは、あるプロジェクトが サブツリーマージ .

git.git リポジトリには、履歴グラフに 6 つのルートコミット(Linus の最初のコミットがそれぞれひとつずつ。 ギトギト また、当初は別のツールであったものもあります。 ギットギ , ギットウェブ および git-p4 ). この場合、以下のことがわかります。 e83c516 は、おそらく私たちが関心を寄せているものです。これは最も古いコミットであり、ルートコミットでもあります。

一般的なケースでは、そう単純ではありません。

想像してみてください。 libfoo はしばらくの間開発され、その履歴は Git リポジトリ ( libfoo.git ). 独立して、"bar" プロジェクトも開発中です ( bar.git ) が、これほど長くはありません。 リブフー (の中で最も日付の古いコミット)。 libfoo.git の中で最も古い日付のコミットより前の日付を持っています。 bar.git ). ある時点で、"bar" の開発者は、"bar" に libfoo をサブツリーマージでプロジェクトに組み込むことができます。このマージを行う前であれば、「最初の」コミットは bar.git (おそらくルートコミットは1つだけだったでしょう)。しかし、マージ後は複数のルートコミットが存在し、最も古いルートコミットは実は libfoo bar "ではなく、"bar "です。

このように履歴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