コミットを使用して作業内容を保存する

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

Visual Studio 2019 | Visual Studio 2022

リポジトリ内のファイルを変更したときに、作業内容のスナップショットは Git で自動的に取得されません。 特定の変更をステージして、スナップショットにキャプチャするファイル変更を Git に指示します。 ステージングの後、コミットを行ってスナップショットを保存します。

この記事では、次のタスクの手順を説明します。

  • Git で変更を追跡する方法
  • コミットの内容
  • 変更をステージする方法
  • コミットを作成する方法
  • 前回のコミットを更新する方法

Git ワークフローの概要については、Azure Repos Git チュートリアル参照してください。

Git で変更を追跡する方法

リポジトリで作業すると、すべての "追跡対象" ファイルに対する変更が Git で追跡されます。 追跡対象ファイルは、現在ステージされているか、前のコミットに含まれているファイルです。 Git では、追跡対象ファイルが次の 3 つのカテゴリに分けられます。

  • 変更されていないファイル - 前回のコミット以降に変更していないファイル。
  • 変更されたファイル - 前回のコミット以降に変更したが、次のコミット用にステージしていないファイル。
  • ステージされたファイル - 前回のコミット以降に変更し、次のコミット用にステージしたファイル。

3 つの状態を行き来する、リポジトリ内のファイルのライフサイクルを示すスクリーンショット。

コミットを作成するとき、ステージされたファイルと変更されていないファイルのみがスナップショットに使用されます。 変更されたファイルに対するステージされていない変更は保持されますが、スナップショットにはそれらのファイルの変更されていないバージョンが含まれます。 新しいファイルをステージするまで、Git ではそれらに対する変更を追跡したり、スナップショットにそれらを含めたりしません。

コミットは、ローカル Git リポジトリに作成されます。 各コミットは完璧である必要はなく、意図した変更を行うには、いくつかのコミットが必要になる場合があります。 作業するときに、コミットを作成します。完了したら、コミットをリモート リポジトリにプッシュして、他のユーザーと作業内容を共有できます。

コミットの内容

コミットには、次の情報が含まれています。

  • コミット時点のリポジトリ内のすべての追跡対象ファイルのスナップショット。 Git ではスナップショットを使用して差異を算出しますが、スナップショットはコミット間の差異ではありません。 スナップショットを使用すると、ブランチ間の高速な切り替えが可能になり、ブランチのマージがサポートされます。
  • 親コミットへの参照。 ほとんどのコミットには親が 1 つありますが、ブランチ マージ後の次のコミットには複数の親があり、リポジトリ内で最初のコミットにはありません。
  • コミット内の変更を説明するメッセージ。 コミットの作成時にメッセージを入力します。

Git では、各コミットのスナップショットと親参照を使用して、リポジトリ内の開発の完全な記録を保持します。 コードの変更内容を調査するには、リポジトリの Git 履歴を確認します。

変更をステージする方法

コミットのスナップショットを作成するには:

  • "新しいファイル" をステージして、スナップショットにそれらの追加が必要で、今後はそれらのファイルに対する変更を Git で追跡する必要があることを Git に認識させます。
  • "編集されたファイル" をステージして、変更されていないファイル バージョンではなく、変更されているファイル バージョンをスナップショットに含める必要があることを Git に認識させします。
  • "削除されたファイル" をステージして、スナップショットからそれらを削除して追跡対象外にする必要があることを Git に認識させます。

スナップショットから一時ファイル、ログ ファイル、その他のファイルを除外するには、特定のファイルを無視するように Git を構成します。

注意

Git では、編集されたファイルの対話型ステージングがサポートされているため、ファイル内の特定の変更をステージすることを選択できます。 これは、さまざまなコミットで異なるファイル編集を必要とする場合に便利な機能です。

Visual Studio 2022 は、[Git] メニュー、[Git 変更]、および [ソリューション エクスプローラー] のコンテキスト メニューを使用して、Git バージョン管理エクスペリエンスを提供します。 Visual Studio 2019 バージョン 16.8 には、チーム エクスプローラーの Git ユーザー インターフェイスも用意されています。 詳細については、「Visual Studio 2019 - チーム エクスプローラー」タブを参照してください。

[Git 変更] ウィンドウで、[変更] セクション内のファイルを右クリックし、[ステージ] を選んで [ステージされている変更] セクションに追加します。

Visual Studio の [Git 変更] ウィンドウにある [変更] オプションのスクリーンショット。

または、ファイルの横にあるプラス記号を選択して、変更されたファイルをステージすることもできます。 フォルダー内のすべての変更されたファイルをステージするには、フォルダーの横にあるプラス記号を選択します。 リポジトリ内のすべての変更されたファイルをステージするには、[変更] セクションの右上隅にあるプラス記号を選択します。

ファイルを右クリックして [このローカル項目を無視] または [この拡張を無視] を選ぶと、ファイルを無視するよう Git に指示できます。 いずれのコマンドを実行しても、リポジトリに .gitignore ファイルが存在しない場合は作成され、それにエントリが追加されます。 無視されたファイルは、Visual Studio の [変更] セクションに表示されません。 ただし、.gitignore ファイルは、追跡対象ファイルに影響しません。 追跡対象ファイルを無視するように Git を構成する方法については、「ファイルを無視」を参照してください。 時間を節約するために、GitHub gitignore リポジトリからさまざまな開発環境用の .gitignore テンプレートをダウンロードできます。

注意

Visual Studio 2022 バージョン 17.3 以降の Visual Studio では、ファイル内での部分的な変更のステージングがサポートされています。 詳細については、「Visual Studio でコード行をステージする」を参照してください。

コミットを作成する方法

[Git 変更] ウィンドウで、ステージされている変更について説明するメッセージを入力し、[ステージング済みをコミット] を選びます。

Visual Studio 内のコミット情報リンクを示すスクリーンショット。

コミットの詳細を確認するには、コミット リンクを選択します。

Visual Studio の [Git 変更] ウィンドウにある、コミットの詳細リンクを示すスクリーンショット。

注意

すべての変更がステージされていない場合は、ステージングをスキップし、[すべてコミット] を選んで直接コミットできます。

Visual Studio の [Git 変更] ウィンドウにある [すべてコミット] オプションのスクリーンショット。

前回のコミットを更新する方法

Git では、前回のコミットのステージされたファイルまたはメッセージの変更がサポートされています。 この操作により、前回のコミットが新しいコミット (これは両方のコミットからのステージ済みファイルを結合し、新しいコミット メッセージを使用します) に置き換えられます。 コミットの修正は、あるファイルをステージするのを忘れた場合や、前回のコミット メッセージに入力ミスがある場合に便利です。

警告

既にプッシュされたコミットは、リモート リポジトリとの同期の問題を引き起こすので、修正しないでください。 プッシュされたコミットには、次のいずれかの方法を使用します。

  • 前のコミットによって発生した問題を修正する別のコミットを作成し、プッシュします。
  • git revert を使用して、前のコミットによって行われたすべての変更を元に戻す新しいコミットを作成することで、プッシュされた前のコミットを元に戻 します。 その後、新しいコミットをプッシュします。

[Git 変更] ウィンドウで、必要に応じて 1 つ以上のファイルをステージし、コミット メッセージを入力し、[修正] を選んで、[ステージング済みをコミット] を選びます。

Visual Studio の [Git 変更] ウィンドウにある [以前のコミットを修正] オプションを示すスクリーンショット。

[Git 変更] ウィンドウでは、コミット メッセージ、ステージされたファイル、またはその両方の修正がサポートされています。 [修正] を選ぶと、前のコミットの識別子 SHA が表示されます。

次のステップ