Git本読みなおして覚えた技
オーム社の「入門git」2年ぐらいまえに読んで、その時は趣味で使うレベルだったしsubversionと同じ事ができれば困らないレベルだったのでそこで満足していたのですが、最近は仕事でもバリバリgit使っているので再読してみました。
うろ覚えで使ってたりとか新たに覚えたことをいかにまとめていきます。
git config
git config
だとそのgitリポジトリ内だけの設定、
git config --global
だとその環境内のgit全てに適用されます。 ユーザー名とパスワードはグローバルで設定すると思いますが、.gitignoreなんかもたとえばvim使いなら.swpとかはglobalなgitignoreに入れておけばプロジェクト個別の.gitignoreに入れなくて良くて手間も省けるしvim使いじゃない開発者と協業するときもいい感じだと思います。
globalなgitignoreの設定まではこの本に載ってなかったですが、こんな感じです。
https://gist.github.com/ryonext/4992043
git rebase と git pull と git merge
他のブランチ(リモートも含む)の作業内容を反映するのに3種のコマンドがあって、git pull
とgit merge
しか使ってなかったのでrebaseでそういうことができるのを知りませんでした。rebaseは
git rebase -i HEAD^
とかでコミットログを書きなおすときにしか使ってなかったですね。 rebaseとmergeの違いがまだよくわかってないのですが。
git add -i
git add を対話的に追加する機能。最近、デバッグのためにいくつかのファイルを変更して、結果的に一個のファイルの一箇所を修正すれば良かったということがわかる、というのがよくあるのですが、そういうときにgit diff
でチェックして必要な物だけ選んだりしているのですがこのコマンドを使えばいいかも、と思いました。
エイリアス
git cofing --global alias.[エイリアス名] "[コマンド名]"
をすることにより、git [エイリアス名]
でgitコマンドが実行されることに。zshでgitもgにエイリアスして、 g s
でgit status
、g d
でgit diff
が実行されるようにしてみました。でも、全部zshのエイリアスでやればいいじゃん、という説もあるのでどうしようか迷ってるなう。
ステージングエリアとリポジトリ間のgit diff
git diff --cached
でgit add したものとリポジトリの間のdiffが見れる。
ステージングエリアも含めすべて見るときはgit diff HEAD
CONFLICTに対処するgit mergetool
今回再読して最大の収穫がこれ。conflictしたときに、git mergetool
というコマンドを実行すると、conflictを解消するためのツールが立ち上がって良い感じにconflictを解消していけるというもの。私のMacだとデフォルトでfilemergeというソフトが立ち上がったのですが、環境によってはなにを立ち上げるかは設定が必要だったりもするみたいです。
これで目で見て
<<<<<<<<
とかを消していく作業から解放されます。
git logの引数いろいろ
git log --since="5 hours"
とかgit log [sha-1]..[sha-1]
とかできるそうです。
バージョン間の差分
git diff --stat [tag]
でバージョン間の統計的情報が見れます。 これでバージョンごとに追加されたファイルや行数がわかります。
取り消し
ミスコミットを取り消すのに
git revert [バージョン]
で間違ったバージョンを上書きするコミットをしてくれます。このコマンドは実行するだけでコミットされますが、-n
を付けることで即時でコミットされなくするということもできます。 自分のローカルだけでのミスならgit reset
やgit rebase
で消せますが、GitHubにpushしたあとで間違いに気づいた場合はrevertで戻していくのがよさそうですね。
git rebase -i
これはググって得た情報を元にバリバリ使ってたんですが、改めて書籍で読んだということで。 いくつかのコミットを一つにまとめたり、順番を変えたりできます。自分がよく使うのは、とりあえずコミットしておいてあとでsquashで一つにまとめる、というのが多いですね。
submodule
git submoduleにより他のgitリポジトリの内容をプロジェクトに入れるものです。 注意するのは、submoduleの内容は常に最新を追ってくれるのではなく、ある特定のコミットの内容を追い続けていて更新するにはcheckout,add,commitが必要ということです。updateしたら常に最新を追ってくれるようなオプションがあってもよさそうなんですが、そういうものらしいです。
履歴の圧縮
ずっと使っていると重くなるらしいのでgit gc
することで履歴を圧縮して軽くしてくれるようです。このコマンドを知らずに使ってましたけど、subversionと比べて全然軽いですけどね。
その他
- git rebase --onto
- ブランチの内容を別のブランチに移動するコマンド
- git bisect
- リポジトリを二等分してバグが紛れ込んだコミットを特定するのに使えるコマンド
まとめ
結構git使ってたのですが、まだまだ知らない機能がいっぱいありましたね。知らないとできない、というのではなく他のコマンドの組み合わせで対処していたものが別のコマンド1つで実行できるようになっているというのがいくつかありました。
それと、一度読んだ技術書でもある程度理解が深まったあとで再読すれば新たな発見が多いんだな、というのに気づきました。小説とかゲームを結末を知ったあとで読んでいくと新たな発見があるのに近いのかも。ということで、今後は一度読んだ技術書を再読していくのに時間を取っていこうと思います。
- 作者: Travis Swicegood,でびあんぐる
- 出版社/メーカー: オーム社
- 発売日: 2009/08/12
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 305回
- この商品を含むブログ (96件) を見る