月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

Git本読みなおして覚えた技

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 pullgit 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 sgit statusg dgit 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 resetgit 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つで実行できるようになっているというのがいくつかありました。

それと、一度読んだ技術書でもある程度理解が深まったあとで再読すれば新たな発見が多いんだな、というのに気づきました。小説とかゲームを結末を知ったあとで読んでいくと新たな発見があるのに近いのかも。ということで、今後は一度読んだ技術書を再読していくのに時間を取っていこうと思います。

入門git

入門git