Git 履歴について

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git には、リポジトリ全体のスナップショット (コミット) のグラフとして履歴が格納されます。 各コミットには、1 つ以上の以前のコミットへのポインターも含まれます。 コミットには複数の親を含めることができ、直線ではなくグラフのような履歴が作成されます。 この履歴の違いは非常に重要であり、ユーザーが Git を理解しにくいと感じる主な理由です。

注意

自分が行ったことがわかっている Git 履歴の変更が見つからない場合は、Git で自分の変更が見つからない:Git の履歴の簡略化を見てみるで、Git 履歴の簡略化がどのように機能するかに関する詳細情報を確認してください。

コミット履歴の基本

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

1 行に 3 つのコミット

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

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

git pull origin main

これにより、リモート リポジトリの main ブランチ (既定では origin と呼ばれる) からローカル リポジトリの main ブランチにすべてのコミットがコピー ("プル") されます。 プル操作によって 1 つの新しいコミットがコピーされ、ローカル リポジトリ内の main ブランチがこの新しいコミットを指すようになりました。

4 番目のコミット D が行に追加されている

ブランチ履歴を理解する

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

git checkout -b cool-new-feature

これは 2 つのコマンドを組み合わせたショートカットです。git branch cool-new-feature でブランチを作成し、続いて git checkout cool-new-feature でブランチでの作業を開始します。

ブランチ cool-new-feature が追加されている

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

2 つの新しいコミットが追加されている

コミットは、cool-new-feature ブランチで作成したため、そのブランチから到達できます。 特徴が完成したので、main にマージします。 これを行うには、次のコマンドを使用します。

git merge cool-feature main

マージ後

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

実際の履歴

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

git グラフのコンソール ログ

これで分岐とマージによってグラフの形状がどのように作成されるかを理解したので、恐れる必要はありません。