Git またはその他のバージョン管理システムで作業する場合、「保存」という概念は、ワープロのような従来のファイル編集アプリケーションにおける保存とは微妙に異なるプロセスとなります。従来のソフトウェアにおける「保存」は、Git 用語の「コミット」と同義です。Git では、コミットが「保存」に相当します。従来の保存は、既存のファイルの上書きや新規ファイルの書き込みに使用するファイルシステム操作と考えることができます。一方、Git のコミットは、ファイルやディレクトリのコレクションに対する操作です。

また、Git および SVN における変更の保存は、プロセスが異なります。SVN のコミットである「チェックイン」は、集中管理型サーバーへリモートプッシュを実行します。つまり、SVN のコミットでは、プロジェクトの変更を完全に「保存」するためにインターネットアクセスが必要となります。Git のコミットは、ローカルでキャプチャ、構築してから、必要に応じて git push -u origin master コマンドを使ってリモートサーバーにプッシュすることが可能です。この 2 つの方法の違いは、アーキテクチャ設計の基本的な違いによるものです。Git が分散アプリケーションモデルであるのに対し、SVN は集中管理型モデルです。一般に、分散アプリケーションには集中管理型サーバーのような単一障害点がないため、より信頼性が高くなっています。

Git プロジェクトの現在の状態のスナップショットを保存するには、git addgit statusgit commit の各コマンドをすべて組み合わせて使用します。

Git には、「stash」という追加の保存メカニズムがあります。stash は、コミットする準備が整っていない変更のための一時的なストレージ領域です。stash は、3 本の柱の 1 本目である作業ディレクトリ上で機能し、幅広い使用オプションが備わっています。詳細については、git stash ページを参照してください。

Git リポジトリは、特定のファイルやディレクトリを無視するように設定できます。このようにすると、Git は無視されたコンテンツへの変更を保存しません。Git には、無視リストを管理する設定方法が複数用意されています。Git の無視設定の詳細については、git ignore ページを参照してください。

git add

git add は、作業ディレクトリ内の変更をステージングエリアに追加するコマンドです。このコマンドは、個々のファイルのアップデート内容を次回コミット対象とするよう、Git に指示します。ただし、実際には git add コマンドだけではリポジトリに何も影響しません。git commit コマンドを実行するまで、変更が実際に記録されることはありません。

これらのコマンドと関連して、作業ディレクトリおよびステージングエリアの状態を確認するには、git status コマンドを使用します。

仕組み

git add および git commit コマンドは、Git の基本的なワークフローを構成します。すべての Git ユーザーは、所属するチームのコラボレーションモデルがどうであれ、これら 2 つのコマンドを理解しておく必要があります。これらは、プロジェクトのバージョンをリポジトリの履歴に記録する手段です。

プロジェクトの進行と共に、編集 / ステージ / コミットの基本パターンが繰り返されます。ユーザーはまず、作業ディレクトリにあるファイルを編集します。現在の作業ディレクトリの状態を保存する用意ができると、git add コマンドを使用して変更をステージします。ステージされたスナップショットに問題がなければ、git commit コマンドを使用してローカルリポジトリにコミットします。git reset は、コミットやステージされたスナップショットを元に戻すコマンドです。

git addgit commit に加え、第三のコマンド git push が、コラボレーティブな Git ワークフローには欠かせません。git push は、コラボレーションを実現するため、コミットされた変更をリモートリポジトリに送信するのに使用します。この操作により、保存された変更に他のチームメンバーがアクセスできるようになります。

Git チュートリアル: git add スナップショット

git add コマンドと、ファイルをリポジトリに追加する svn add コマンドを混同しないでください。git add は、変更に対してより抽象的なレベルで機能するコマンドです。つまり、svn add はファイルごとに一度だけ呼び出すコマンドですが、git add はファイルを改変するたびに呼び出す必要があります。これは冗長にも思えますが、このワークフローによってプロジェクトをよく管理された状態に保ちやすくなります。

ステージングエリア

git add コマンドの主な機能は、作業ディレクトリ内の保留中の変更を git staging エリアに進めることです。ステージングエリアは、Git が持つユニークな機能のひとつであり、SVN (あるいは Mercurial) に慣れた人にとっては理解しにくい概念かもしれません。これは、作業ディレクトリとローカルリポジトリとの間のバッファーであると考えるとよいでしょう。ステージングエリアは、作業ディレクトリ、コミット履歴と並ぶ Git の「3 本柱」の 1 つと見なされています。

ステージを用いることにより、最後にコミットを行ってから以降のすべての変更を一度にコミットするのではなく、関連性の強い変更のみを区分けし、焦点が明確なスナップショットを作成してから実際のコミットを行なうことができます。即ち、関連性は気にせずに好きなようにファイルに変更を加えた後で関連性の強い変更をまとめてステージに加え、小刻みにコミットを行なうことによって、論理的によく整理されたコミットにすることができるのです。他のバージョン管理システムでも同様ですが、プロジェクトの他の部分への影響を最小に抑えつつバグの原因追跡や変更の取り消しが容易にできるように、一回のコミットは小さな規模にすることが重要です。

Common options

git add <file>

<file> に加えられたすべての変更をステージして次回のコミットの対象とします。

git add <directory>

<directory> に加えられたすべての変更をステージして次回のコミットの対象とします。

git add -p

インタラクティブなステージングセッションを開始します。インタラクティブなステージングセッションでは、ファイルの一部を選択してステージし、次回のコミットの対象とすることができます。このコマンドを実行すると、変更部分が表示され、それに対する次のコマンド入力を要求されます。y を入力するとその部分がステージされ、n を入力するとその部分は無視されます。また、s を入力するとその部分はより小さい部分に分割され、e を入力するとその部分を手作業で編集することが可能となり、q を入力するとインタラクティブなセッションを終了します。

新規プロジェクトを開始する場合、git add コマンドは svn import コマンドと同じ働きをします。カレントディレクトリのコミットを初めて行う場合は、次の 2 つのコマンドを使用します。

git add .
git commit

プロジェクトが順調に進み始めた後は、git add にパスを渡すことによって新規ファイルを追加できます。

git add hello.py
git commit

上の二つのコマンドは、既存ファイルに加えられた変更を記録する場合にも使用します。即ち、Git は新規ファイルを作成したことによる変更と既にリポジトリに保存されているファイルの内容の変更を区別しません。

まとめ

まとめると、現在のプロジェクトの状態のスナップショットをコミット履歴に「保存」するよう Git に指示する最初のコマンドが git add です。そのまま使用すると、git add は作業ディレクトリ内の保留中の変更をステージングエリアに進めます。git status コマンドは、リポジトリの現在の状態を確認するために使用します。git add による移動を確認するために使うことも可能です。git reset コマンドは、git add を元に戻すために使用します。その後、git commit コマンドを使って、ステージングディレクトリのスナップショットをリポジトリのコミット履歴にコミットします。

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める