Git
Chapters ▾ 2nd Edition

A3.3 Appendix C: Gitのコマンド - 基本的なスナップショット

基本的なスナップショット

コンテンツをステージングしたり、それを歴史に対してコミットしたりする基本的なワークフローについては、基本的なコマンドが少しあるだけです。

git add

git add コマンドは、次のコミット用に、ワーキングディレクトリからステージングエリア(または “インデックス”)へコンテンツを追加します。git commit コマンドの実行時、デフォルトではこのステージングエリアしか参照しません。そのため、 git add は、次のコミットのスナップショットが正確にはどのようになっていて欲しいのかを組み立てるのに使用されます。

このコマンドは、Gitの中でも非常に重要なコマンドです。本書の中でも、何十回も言及したり使用したりしています。ここでは、その中で見られるユニークな使用法をいくつか取り上げます。

git add の紹介と詳細な説明を最初に行ったのは 新しいファイルの追跡 でした。

マージ時のコンフリクト では、マージの衝突を解決するためにこのコマンドを使用する方法について言及しました。

対話的なステージング では、このコマンドを使って、変更されたファイルのうち、特定の部分だけを対話的にステージングする方法について細かく見てきました。

最後に、 ツリーオブジェクト では、舞台裏で何を行っているかを理解するため、このコマンドを低レベルで模倣しました。

git status

git status コマンドは、作業ディレクトリとステージングエリアとに対して、ファイルの状態について別々の内容を表示します。それぞれ、変更されているがステージングされていないファイルはどれか、ステージングされているがまだコミットされていないファイルはどれかを表示します。通常の使用法では、これらのステージの間でファイルを移動する方法について、基本的なヒントも表示します。

最初に status を取り上げたのは ファイルの状態の確認 で、基本的な使用法と単純化された使用法の両方を取り上げました。本書の全体を通してこのコマンドを使ってきましたが、git status コマンドで行えることのほぼすべてをここで取り上げています。

git diff

git diff は、2つの任意のツリーで確認したい場合に使用します。これは、作業中の環境とステージングエリアの差異(git diff だけで表示される)でもよいですし、ステージングエリアと最後のコミットの差異(git diff --staged)でもよいですし、2つのコミットの差異(git diff master branchB)でもよいです。

git diff の基本的な使用法を最初に見たのは ステージされている変更 / されていない変更の閲覧 でした。ここでは、どの変更がステージングされていて、どの変更がまだステージングされていないのか見る方法を示しました。

コミットの指針 では、--check オプションを使って、問題となる空白文字がないかをコミット前に探すのに使いました。

何が変わるのかの把握 では、git diff A...B という文法を使って、ブランチ間の差異をより効率的にチェックする方法を見てきました。

高度なマージ手法 では、-b を使って空白文字の差異をフィルタしました。また、 --theirs--ours--base を使って、衝突しているファイルのいろいろな段階を比較しました。

最後に、 サブモジュールの作り方 では、サブモジュールの変更を効率的に比較するために --submodule を使いました。

git difftool

git difftool コマンドは、単に外部ツールを起動して、2つのツリーの差異を表示します。これは、ビルトインの git diff 以外のコマンドを使いたい場合に使用します。

このコマンドについては、 ステージされている変更 / されていない変更の閲覧 で簡単に言及しただけです。

git commit

git commit コマンドは、git add でステージングされたすべてのファイルの内容を取得し、データベースに新しく永続的なスナップショットを記録し、最後に現在のブランチのブランチポインタをそこまで進めます。

コミットの基本を最初に取り上げたのは 変更のコミット でした。そこではまた、 -a フラグを使って、日々のワークフローで git add を行うステップを省略する方法の実例を示しました。また、-m フラグを使って、コミットメッセージを、エディタを起動するのではなくコマンドラインから渡す方法についても説明しました。

作業のやり直し では、--amend オプションを使って最新のコミットを取り消す方法を取り上げました。

ブランチとは では、git commit が何を行っているか、なぜそのようなことをするのかについて非常に細かいところまで説明しました。

コミットへの署名 では、-S フラグを使って、コミットに暗号を使って署名を行う方法を見てきました。

最後に、 コミットオブジェクト では、 git commit コマンドがバックグラウンドで何を行っているのか、またそれが実際どのように実装されているのかを簡単に見てきました。

git reset

git reset コマンドは、その動詞から分かるかも知れませんが、主に物事を元に戻すのに使われます。このコマンドは、 HEAD ポインタをあちこち動かし、必要に応じて インデックス またはステージングエリアに変更を加えます。 --hard を使えば作業ディレクトリを変更することもできます。この最後のオプションは、誤って使用すると作業結果を失う可能性があるので、必ずその点を理解した上で使用してください。

git reset の最も単純な使用法を実質的に初めて取り上げたのは ステージしたファイルの取り消し でした。ここでは、 git add したファイルのステージを解除するのに使いました。

リセットコマンド詳説 は、全体がこのコマンドの説明に費やされており、このコマンドについてかなり詳細に取り上げています。

[_abort_merge] では、 git reset --hard を使用してマージを中断しました。また、git reset コマンドのちょっとしたラッパーである git merge --abort も使用しました。

git rm

git rm コマンドは、ステージングエリアおよびGitの作業ディレクトリからファイルを削除するのに使用されます。これは、次のコミット用に git add でファイルの削除をステージングするのに似ています。

ファイルの削除 では、 git rm コマンドの詳細を取り上げました。ファイルを再帰的に削除する方法、 --cached を使って作業ディレクトリにファイルを残しつつステージングエリアからファイルを削除する方法などについて取り上げました。

これ以外の方法で git rm を使用したのは オブジェクトの削除 だけです。ここでは、 git filter-branch を実行した際に、 --ignore-unmatch について簡単に説明しました。これは、削除しようとしているファイルが存在しなかった場合でもエラーとしないオプションで、スクリプトを作成する際に役立ちます。

git mv

git mv は簡単な便利コマンドで、ファイルを移動した上で、新しいファイルを git add し、古いファイルを git rm します。

このコマンドについては、 ファイルの移動 で簡単に言及しただけです。

git clean

git clean コマンドは、作業ディレクトリから不要なファイルを削除するのに使用されます。これには、ビルド時の一時ファイルやマージ衝突ファイルの削除が含まれます。

作業ディレクトリの掃除 では、cleanコマンドのオプションの多くや、cleanコマンドを使用する シナリオについて取り上げました。