What is it, naokirin?

私の使うGitコマンドまとめ 基本コマンド編

独りAdvent Calendarへの挑戦の一発目として、私がよく使うGitのコマンドをまとめていくことにします。
あまり使いこんではいないので役に立つかわかりませんが書いていきます。

git init (リポジトリの作成)

cd path/to/repo
git init

で path/to/repo ディレクトリにGitのリポジトリの作成を行います。

リポジトリの作成の際に行われることはディレクトリ下に

ls -a
.  ..  .git

のように.gitディレクトリを作成することです。
この.gitディレクトリにGitの管理ファイルが格納されます。
つまり通常、このディレクトリ下を触ることはありません

--bare
git init --bare

のようにbareオプションをつけた場合、bareリポジトリを作成します。
bareリポジトリは、作業ファイルがなく、管理ファイルのみのリポジトリになります。
つまりコミットなどはそのリポジトリでは行われません。(というか行えない。)

そのためbareリポジトリは、サーバ側のリモートリポジトリとして使うリポジトリを作成する際に使用します。
さらに通常リモートリポジトリは

git init --bare --shared=true

のようにします。グループで共有するためには--shared=trueを指定しないといけないみたいです。
--bareのオプションはほとんど使ったことがないので詳しく知りません。

git add (管理するファイルの指定)

リポジトリを作成したら、次に行うのがコミットの対象にするファイルを指定することです。

git add <ファイル名>

とすることで、Gitのリポジトリで管理・コミット対象にするファイルを指定します。ちなみに複数のファイルを書きならべて

git add file1 file2 file3

のようにしても、指定できます。

大量に存在するファイルをいちいち上記のような指定をすると面倒なので

git add .

のように指定すると、ディレクトリ下の全てのファイルをGitの管理対象にできます。(もちろん、.gitディレクトリ下は管理されません。)

また、ある特定のファイルのみに絞る際には

git add *.foo

のようにワイルドカードによる指定もできます。(ただしこちらは上の「.」とは異なり、シェルの機能のようです。)

ちなみに正確には git add は「インデックス」に記録をするものです。
詳しくは、この記事でまとめて書いてみたいと思います。

-u

インデックスに記録されているファイルの中でインデックスに比べて変更があるファイルをインデックスに記録するものです。
インデックスに追加した後に、さらに変更を加えた際にはこのオプションを使います。

-A

インデックスに記録されていないファイルも含めてインデックスに記録を行います。(ただし、.gitignoreで指定されたファイルは除く)
インデックスに記録されていないファイルも含めてインデックスに記録したい場合にはこちらのオプションを使います。

-p

インデックスに記録する変更を指定することができます。
これにより、次回のコミットでコミットする内容を操作できます。
ワーキングツリーに複数の変更を加えたけれど、その変更それぞれを複数回のコミットに分けたいときに行います。

ちなみに、指定する際には

y インデックスに記録
n インデックスに記録しない
s もっと細かいhunk(変更箇所のまとまり)に分ける
e 手動でインデックスに記録するhunkを指定

となっています。

git rm (ファイルの削除)

Gitではファイルの変更を監視するため、ファイルの削除などもGitで見る必要があります。
通常の削除を行ってしまうと、Gitでは管理中となっているファイルが存在しないという状態になります。
そこで

git rm <ファイル名>

のように通常のファイル削除とGitの管理からそのファイルを外すということを行います。
ちなみに、ファイル名は git add のときと同じようにワイルドカードなども使用できます。

また通常のシェルコマンドのrmと同じく、-r も使えます。

--cached

もし、git rm すべきときに単純な削除をしてしまった場合や、git add で不要に追加されてしまった(インデックスに記録されるように指定してしまった)場合は

git rm --cached <ファイル名>

のようにするとそのファイルを、インデックスからのみ削除します。つまり実際のファイルは削除されず、Gitの管理下からのみ削除されます。
(ちなみに、git reset HEAD とするとインデックスを破棄できます。インデックスに記録されたもののうち不要なものだけ取り除く場合は git rm --cached 、インデックス全体を破棄するには git reset HEAD を使います。)

-n
git rm -n <ファイル名>

のようにすると、-n 無しで実行した際に削除されるファイルの一覧を表示します。
ワイルドカードなどを用いた削除を行う際の確認などに重宝します。

git mv (ファイルの移動・リネーム)

git rm でも説明したようにGitでは管理されているファイルの変更を監視しているので、実際には削除や移動などの変更はGitに伝える必要があります。

移動やリネームの際に用いるのが、git mv です。
基本的な使い方はシェルコマンドのmvと同じです。

リネームなら

git mv <ファイル名> <変更後のファイル名>

です。

git commit (コミット)

実際にGitで歴史として、変更を記録していくためにはコミットを行う必要があります。

git commit

git commitを行うと、現在インデックスに記録されている変更を歴史として記録します。
つまり、対象とするファイルはあらかじめ git add などでインデックスに記録されている必要があります。
git add を毎回叩かないで済むようなオプション(-aなど)も用意されています。

コミットの際には、コミットの内容をコミットメッセージとして記録するために、指定されているエディタ(初期設定ではvim)が起動します。

Gitでは1行目に概要、2行目を空行、3行目以降に詳細な変更の内容を書くというのが基本的なコミットメッセージの書き方です。

コミットメッセージの書き方

1行目 概要を書く
2行目 空行にする
3行目 詳細な説明を書く

-a

管理中の変更が加えられたファイルを自動的に検出して、そのファイル群をコミットします。
普段

git add -u
git commit

とする場合には、こちらを使う方がいいでしょう。
git add -p を使った場合などではこのオプションを指定しないようにしましょう。

-m

エディタを起動せずにコマンドでコミットメッセージを指定します。

git commit -m "コミットメッセージ"

ちなみに

git commit -m "msg1" -m "msg2"

のようにすると、コミットメッセージは

msg1

msg2

のように1つ目に指定したメッセージは1行目、2つ目に指定したメッセージは3行目になります。

--amend

前回のコミットを修正する際に使います。
元のコミットとは別にコミットを作り、そのコミットにHEADを差し替えます。

たとえば、Zのコミットを修正したいとします。

この状態でインデックスに変更を加え、git commit --amend を実行すると

となります。元のコミットZから新しいコミットZ'につけ変わることになります。

実際には前回のコミットに上書きを行うようなものだと考えてもいいと思います。