Rails、Perlなど、近年多くの大規模プロジェクトで採用されているバージョン管理システムが「Git」だ。Gitには非常に多数のコマンドが用意されているが、日常的に使用するコマンドは20個程度と言われている。本記事では、Gitを使いこなすために覚えるべき20個のGit基本コマンドを紹介する。Rails、Perlなど、近年多くの大規模プロジェクトで採用されているバージョン管理システムが「Git」だ。Gitには非常に多数のコマンドが用意されているが、日常的に使用するコマンドは20個程度と言われている。本記事では、Gitを使いこなすために覚えるべき20個のGit基本コマンドを紹介する。Gitの基本的な考え方や使い方については分散バージョン管理システムGit入門でも紹介しているので、そちらも参照してほしい。init」-リポジトリを作成するGitを利用するには、まずリポジトリの作成が必要だ。リポジトリを作成したいディレクトリでこのコマンドを実行すると.gitディレクトリが作成され、Gitリポジトリの管理ファイル等がここに作成される。initコラム:Gitが利用する管理ファイルGitの管理ファイルは.gitディレクトリ内に保存される。このディレクトリ内にはさまざまなファイルが格納されるが、通常これらのファイルの存在を意識する必要はない。リポジトリの各種設定は.git/configファイル内に記録される。config」コマンドが用意されているが、このファイルを手動で変更することでも設定変更が可能だ。clone」コマンドを利用する。このコマンドは既存のリポジトリからローカルにファイルをコピーして作業用のリポジトリを作成する、といった場合などに利用する。<複製したいリポジトリのURL>リポジトリのURLは表1のような形式で指定する。<Gitリポジトリのパス>もしくはfile://<Gitリポジトリのパス>また、作成するディレクトリ名を指定することもできる。cloneはリポジトリの履歴情報までも含めてリポジトリを複製するため、大規模なプロジェクトの場合は多くのファイルを取得/コピーしなければならないことがある。最新のソースファイルを取得する目的のみで使用し、ソースファイルの修正を行わない場合は、「–depth」オプションで取得するリビジョン数を指定するとよい。fsck」で破損している個所を検出できる。fsck」では、「danglingオブジェクト」と呼ばれるテンポラリオブジェクトも検出される。add」で追加したファイルに別の変更を加えてコミットした場合などに残されるものだ。このファイルはストレージ容量を消費するものの、残っていても大きな害はないため、無視して構わない。gc」コマンドを実行することで、一定期間(デフォルトでは2週間)よりも前に作成されたdanglingオブジェクトを破棄することができる。gc」コマンドは、リポジトリ内のオブジェクトの圧縮(pack)や不要なオブジェクトの破棄などを行うものだ。これによってリポジトリが使用するストレージ容量を減らせるだけでなく、パフォーマンスの向上も期待できる。頻繁に実行する必要はないが、大量のコミットやマージを行った場合などには実行するとよいだろう。status」で確認できる。statusを実行すると、次の例のように追加/変更されたファイルの情報が表示される。diff」コマンドで確認できる。commit」コマンドを実行する。commitを「-a」オプションを付けて実行すると変更が加えられたファイルを自動検出してコミットできる。この場合新規に作成されたファイルはコミット対象にはならない。commitコマンドを実行するとエディタが起動してコメントメッセージの入力が求められる。エディタを起動したくない場合は「-m」オプションでメッセージを指定すればよい。log」でリポジトリのコミットログを閲覧できる。コミットログは新しいものから順に表示され、次の実行例のようにそれぞれのコミットについてそのコミットを表すハッシュ値とコミット者、タイムスタンプ、コメントが表示される。:コラム:Gitのコミットはリビジョンでなくハッシュで管理されるCVSやSubversionではコミットを「リビジョン」という数値で管理するが、Gitの場合コミットをハッシュ文字列で管理している。特定のファイルをその過去のバージョンと比較する、といった場合、どのバージョンのファイルと比較するかはハッシュ文字列で指定する。ハッシュ文字列でコミットを指定する場合、必ずしもすべてを入力する必要はなく、そのコミットを一意に特定できる先頭数桁を入力すれば良い。コミットの指定はハッシュだけでなく後述の「ショートネーム」と呼ばれるエイリアスのようなもので指定することも可能だ。HEAD^」と実行すると、直前に行ったコミットを取り消すことができる。HEAD^この場合、作業ツリーの内容はコミット時のままで「コミットした」ということだけが取り消される。作業ツリーに加えた変更点までも取り消したい場合は、「–soft」の代わりに「–hard」を指定すればよい、また、コミットされていた内容は「ORIG_HEAD」という名前で参照できる。これを利用して、次のように実行することで現在の状態とコミットされていた状態の差分を表示できる。ORIG_HEAD修正後に再度コミットを行うには、下記のようにする。これを実行すると、先に入力したコミットメッセージを再編集してコミットが行える。commitに「–amend」オプションを付けて実行することで、直前に行っていたコミットを訂正することができる。(先に行ったコミットが、ミスを修正したものに置き換えられる)上記の操作は、次のような操作とほぼ同一の働きをする。revert」は作業ツリーを指定したコミット時点の状態にまで戻し、コミットを行うコマンドである。引数にはコミットを指定するハッシュ文字列もしくはタグ名などを指定する。resetと似ているが、作業ツリーを差し戻したという情報が作業履歴に残るのが異なる点だ。branch」を使用する。checkout」を使用する。新たに「temp01」というブランチを作成し、以後このブランチで作業を行うには次のようにする。checkoutに「-b」オプションを付けて実行すると、新たにブランチを作成してそのブランチに切り替える、という作業が一発で行える。temp01」は、次の2つのコマンドを順に実行した場合と同じ結果になる。show-branch」で確認できる。show-branchでは次の例のような出力を行うが、前半の「—」までがブランチ履歴、「—」から後半が最近のコミット履歴を表している。log.前半部分ではブランチが階層構造で表示されており、「*」が付いている行が現在の作業ブランチになる。[]内の文字列はそれぞれのコミット単位を表すショートネームだ。この例では、「master」から「temp01」ブランチが作成され、さらに「temp01」から「temp02」ブランチが作成されたことが分かる。merge」は、現在の作業ブランチに別のブランチで行われた変更点を取り込むコマンドだ。<変更点の取り込み元ブランチ>マージが成功した場合はそのままコミットも行われる。競合が発生したファイルには下記のような形式で競合している個所にマーカーが埋め込まれる。<ブランチ名>:<ファイル名>たとえば、下記は「markup.pl」というファイルに対してマージを行い、競合が発生した例である。e74597cbfdb9995e540ca9e8c8a6e79705e2889c:markup.pl」までがマージ元ブランチ内のmarkup.plに記述されていたものとなる。s/>/&gt;/g;}なお競合が発生した場合、このマーカーを取り除いて競合を解消するか、もしくはマージを取り消すまでコミットが行えないので注意してほしい。tag」-コミットにタグを付けるGitではコミットをハッシュ文字列で管理しているため、ユーザー側から見るとどの文字列がどのコミットを表しているのか分かりにくい。tag」は、直前のコミットに対して分かりやすい別名(タグ)を付けるコマンドだ。tagを実行すると、現在のリポジトリ内にあるタグを確認できる。stash」コマンドだ。このコマンドでは、現在の作業ツリーの状態を一時的に保存しておくことができる。checkoutなどで作業したいブランチをチェックアウトすればよい。pop」コマンドを実行する。list」を実行すると、一時保存されている作業ツリーが一覧表示される。rebase」は、「ブランチの派生元を変更する」という、CVSやSubversionにはなかったユニークな機能である。rebaseがどのような処理を行うかは次の図1を参照してほしいが、簡単に言えばあるブランチに対して行った変更点を、派生元のより新しいリビジョンのものに適用するものだ。いう3回のコミットを行っている。ブランチBを作成したのち、ブランチAには複数のコミットが行われている。ブランチA」を実行すると、ブランチAの最新版に対して、ブランチBを作成してからブランチBの最新版までの間に加えられた変更(この場合変更αと変更β、変更γ)が適用され、それがブランチBの最新版となる。rebaseを利用するには、作業を行いたいブランチで次のように実行すればよい。mergeの場合と同様に競合点がマーカーとともにファイルに記載される。–abort」でrebaseを取り消すこともできる。pull」コマンドを利用する。cloneの場合と同様にURLで指定する(表1)。cloneコマンドで作成したリポジトリの場合、.git/config内の「remote」項目などに複製元リポジトリのURLが自動的に記録されるため、複製元リポジトリからpullを行う場合は下記のように取り込み元リポジトリを指定しなくとも実行できる。pushの引数には、送信先のリポジトリURLと送信するブランチ、送信先ブランチを指定する。<送信するブランチ>:<送信先ブランチ>送信先ブランチを指定しなかった場合は、送信するブランチと同じブランチを指定したものとみなされる。送信先ブランチが送信先リポジトリに存在しない場合はそのブランチが作成される。コラム:公開リポジトリと通常のリポジトリとbareリポジトリGitの公開リポジトリは通常、管理ファイルのみを持つ「bareリポジトリ」として作成される。通常bareリポジトリでは作業ツリーの変更やコミットといった操作は行わず、ファイルのやりとりにのみ使用する。慣例としてbareリポジトリとして使用するディレクトリには「.git」という拡張子が付けられる。initを実行することで作成できる。