Git 履歴について

Git は、Team Foundation Version Control、Perforce、Subversion などの集中バージョン管理システム (CVCS) とは根本的に異なる方法で履歴を表します。 集中管理システムは、ファイルごとに個別の履歴をリポジトリに保存します。 Git は、履歴をリポジトリ全体のスナップショットのグラフとして保存します。 Git では commit と呼ばれるこれらのスナップショットには複数の親を持つことができ、直線ではなくグラフのような履歴が作成されます。 この歴史の違いは非常に重要であり、CVCS に慣れているユーザーが Git を混乱させる主な理由です。

コミット履歴の基本

単純な履歴の例 (3 つの線形コミットを含むリポジトリ) から始めます。

Three commits in a line

コミット A はコミット B の親であり、コミット B はコミット C の親です。この履歴は CVCS とよく似ています。 コミット C を指す矢印はブランチです。 ブランチは特定のコミットへのポインターであるため、Git ではブランチが非常に軽量で簡単です。

CVCS と比較した Git の主な違いは、開発者が独自のリポジトリの完全なコピーを持っていることです。 リモート リポジトリから最新のコミットを取得することで、ローカル リポジトリとリモート リポジトリの同期を保つ必要があります。 これを行うには、次のコマンドを使用してメイン ブランチをプルします。

git pull origin main

これにより、メイン ブランチからのすべての変更がリモート リポジトリにマージされます (Git ではデフォルトで originという名前が付けられます)。 このプルにより 1 つの新しいコミットが導入され、ローカル リポジトリのメイン ブランチがそのコミットに移動します。

A fourth commit, D, is added to the line

ブランチ履歴を理解する

次に、コードを変更します。 異なる機能を並行して作業する場合、複数のアクティブなブランチが存在するのが一般的です。 これは、新しいブランチが重く、ほとんど作成されない CVCS とはまったく対照的です。 最初の手順は、次のコマンドを使用して新しいブランチにチェックアウトすることです。

git checkout -b cool-new-feature

これは 2 つのコマンドを組み合わせたショートカットです。

  • git branch cool-new-featureブランチを作成する
  • git checkout cool-new-featureブランチで作業を開始する

Branch cool-new-feature is added

2 つのブランチが同じコミットを指すようになりました。 2 つの新しいコミット E と F のcool-new-feature ブランチにいくつかの変更があるとします。

Add commits to a branch

コミットは cool-new-featureブランチにコミットされているため、そのブランチから到達できます。 機能が完成したので、メイン ブランチにマージする必要があります。 これを行うには、次のコマンドを使用します。

git merge cool-new-feature main

Merge a branch

マージがあると、履歴のグラフ構造が表示されます。 ブランチが別のブランチにマージされると、Git は新しいコミットを作成します。 これがマージ コミットです。 競合がなかったため、このマージ コミットには変更は含まれません。 競合があった場合、マージ コミットには競合を解決するために必要な変更が含まれます。

実際の履歴

ここでは、チームでのアクティブな開発のコードによく似た Git 履歴の例を示します。 ほぼ同時に自分のブランチから main ブランチにコミットをマージする 3 人がいます。

Console log of git graph

次のステップ

Git 履歴の操作について詳しくは、GitHubAzure Repos または Git ログ履歴の簡素化をご覧ください。