Gitの補足
前回のギトギット! (♬)
- GitHub のアカウントを作った!
- GitHub にリポジトリを作った!
- GitHub リポジトリに git push してバックアップを作った!
序文 で触れた内容は前回で完遂し、みなさんは git をバックアップツールとして使いこなせるようになりました。
今回は、前回までのコマンドを振り返りつつ、補足をしていきたいと思います。
status --short とエイリアス
git status は、作業ディレクトリにあるファイルの状態を知ることができるコマンドでしたが、やや出力が長いのが欠点でした。 実は次のように --short オプションと --branch オプションをつけることで、情報量を減らすことなくコンパクトな表示にすることができます。
$ git status --short --branch
## master
M five.txt
D six.txt
? seven.txt
M は modified (変更されている)、D は delete (削除されている)、 ? は git に登録されていない、ということを表しています。分かりやすいですね。
とはいえ、毎回 --short --branch
なんて入力するのは大変です。
そこで、 エイリアスを使います。
エイリアス(alias) は、「別名」という意味の英単語で、コマンドの別名を作る機能です。
まず次のコマンドを実行して、git の設定ファイルを見てみましょう。
$ git config --global -e
すると、下のほうに、
[alias]
git = !git
co = checkout
...
などと書いてあると思います。 これは 第2回 で使用した設定作成ウィザードが出力する内容です。
ここにある X = Y
という記述が、エイリアスの定義です。
例えば、そのなかに s = status --short --branch
という行が見つかると思います。
これは、
$ git s
というコマンドを実行すると、git は自動的にこれを、
$ git status --short --branch
に読み替えてくれる、ということです。 これならタイピングの量が少なくて楽ですね。
他にも、有名なのは ci = commit
(つまり git ci と書けば git commit を行われる) や、co = checkout
(つまり git co ... と書けば git checkout ... が行われる) などがあります。
この辺も、ウィザードが自動でエイリアス登録してくれています。
また、複数のコマンドを一気に実行するようなエイリアスを作りたいときは、 confirm = !git log && git show
のように、
エイリアス名 = ! コマンド && ...
と書きます。
複数のファイルの add
作成したり変更したりしたファイルを git に登録するときのコマンドは、
$ git add ファイル名
$ git commit
でした。 しかしファイル名をいちいち入力するのはめんどうです。
手間を省く方法の一つに、bash の入力補完機能があります。 どういうことかというと、ファイル名の最初の数文字を入力してからタブキーを押すと、残りが自動的に入力される、というものです。 例えば、ファイル long_long_name.txt というファイルがあるとき、
$ git add long_
ぐらいまで入力してタブキーを押すと、
$ git add long_long_name.txt
になります。
手間を省く手段はまだありますよ!
git add コマンドには、ファイル名だけでなく、ディレクトリ名を与えることもできます。 例えば、
$ git add dir
と書くと、ディレクトリ dir 以下のファイルがすべて git add されます。
また、bash の仕様で、カレントディレクトリことを .
と略記できるので、
$ git add .
と書けば、カレントディレクトリにあるすべてのファイルが git add されます。
git add の省略方法はまだまだあります。
git commit を行うとき、 -a
というオプションを付けると、「変更されたファイル」(作成や削除ではないもの)がすべて自動的に git add されるのです。
$ git commit -a
これは便利ですね。
ウィザードが登録するエイリアスでは、 cia = commit -a -v
になっています。(-v は次節で説明します。)
ただ、これに慣れすぎると、作成したファイルを git add し忘れることがあるので注意です。
commit -v
繰り返しになりますが、変更を git に登録するコマンドは、
$ git add ファイル名
$ git commit
でした。 これを実行すると、エディタが起動して、コミットメッセージ (変更内容の要約文) を聞かれるんでしたね。
みなさんは git log や git show コマンドを使ったことがあるので分かっていると思いますが、過去のバージョンを見ていくときの手がかりとして一番重要なのが、このコミットメッセージです。
そんなコミットメッセージ。 これを頑張って考えるとき、「あれ? いま何を変更したんだっけ?」ってなることありませんか?
こういうときは、いったん git commit を中止する、ということができます。 単に、何も入力せずにエディタを閉じるだけです。 すると、以下のような結果になります。
$ git commit
Aborting commit due to empty commit message.
和訳すると、「コミットメッセージが空欄なので、コミットを中止します。」ということです。
そして、……何の話でしたっけ? あ、そうだ、何を変更したのか忘れたって話だった。
変更点を知るコマンドは、 git diff です。 これを使って変更を見て、要約を考えてから再び git commit の作業に戻れば、万事解決、となるわけです。
上記のような出来事を数回繰り返すと、こう思うようになってきます。
コミットメッセージの編集中に git diff がほしくなることが多いので、git diff の結果を表示してから git commit するようにしよう。
そういうエイリアス (cid = !git diff && git add . && git commit
みたいな) を作ってもいいですが、git の機能を利用してうまくやる方法があります。
それが git commit -v です。
この -v
のオプションを付けると、コミットメッセージを編集するエディタのなかに、git diff の結果が書かれた状態になるのです。
$ git commit -v
とても便利なので、私は ci = commit -v
というエイリアスを作っています。
第2回で私が作ったウィザードで設定を自動生成した人は、このエイリアスが既に使えるようになっていますよ。
試してみてください。
addの機能?
これまで git add は git commit と常にペアで扱ってきました。 すなわち、add 単体の機能については完全に無視してきたのです。
これは、add 単体の機能と深く関係がある インデックス(index) に関して、
- インデックスの概念はやや抽象的なので、初心者には分かりづらいらしい。
- インデックスの概念はやや抽象的なので、私が説明を書くのが難しい。(←これは怠慢)
- インデックスを理解したとしても、それを使いこなして何かをする場面、というのが実際には少ない。
という理由があったからです。
ここで改めて、git add && git commit を簡単に説明すると、以下のようになります。
- git add は、指定したファイルになされた変更を「インデックス」に追加する。
- git commit は、「インデックス」に追加されている変更を、1個の変更記録の形にして保存する。
- この後、インデックスが空になる。
作業ディレクトリ → インデックス → 変更記録、という流れがあるのが分かります。 git add と git commit を常にペアで扱うかぎりでは、間にあるインデックスのことは無視できます。 私の説明はそうしてきましたし、インデックスについて詳しく説明する気はありません。
最低限、インデックスの状態を見る方法について触れて、終わりにしたいと思います。
インデックスに追加されている変更は、git status だと緑色の文字で表示されます。 また、git diff には表示されなくなり、
$ git diff --cached
と書くことで、インデックスの内容を見ることができます。
未履修事項
本稿はこれで最後ですが、git はまだまだ奥が深く、便利な機能がたくさんあります。 なんてったって git の本領である ブランチ(branch) については触れていません。 これで「Git入門」を謳うのはちょっと……と言われるかもしれません。 そういう人にはこう言い返しましょう。
すいません、私の文章力ではまとまりませんでした!
さて、本稿で紹介しなかったもののうち、筆者がよく使う機能を列挙して終わりにします。 余裕があれば、調べてみてください。
- git clone
- git branch
- git merge --ff
- git merge --no-ff
- git rebase
- git rebase -i
- git fetch
- git bisect
- .gitignore
- .git/info/exclude
サヨナラ!