インターンで使用したgitコマンド集
普段の個人開発やチーム開発で多少gitを使う事はあるけど、あまり詳しくないよ、、という方に向けて書く記事です。あとは自分用のメモ的な感じです。
今回のインターンではPostgreSQLのOSSコミットを行ったので、その関連になります。自身がcommitする事は無く、他の人の履歴を遡ったり、パッチを作成したりするのがメインだったので、cherry pick
のようなコミットやマージに関するコマンドは少ないので少ないのでご承知起きください。
git show
これを打つと、headのログメッセージやファイルの差分が表示されます。ブロブやタグなども見れますが、自分はコミット以外見ていないです。以前の変更がどのようになっているかを確認したい時などに使用しました。
詳しく知りたい人は
man git-show
などとすればマニュアルが読めるので、そちらを確認して見てください。
ついでに、
git show --numstat
とすると
どのファイルに何行の変更を加えたか、が見ることが出来ます。--satt
でも同様のことができるのですが、--stat
だけだと合計で何行のinsertとdeleteがあったかしか表示されず、ここのファイルについては見ることが出来ません。--numstat
は詳細などを省くことなく、より詳しく確認することが出来ます。
git blame
このコマンドでは指定されたファイルの各行が誰によって、いつ変更されたかなどが確認できます。これによって、気づいたら変数名や関数名が違った時に、いつ変更されたのかを遡ったり、どのバージョンから変更が加えられたのかを確認することができます。
自分は、ある関数がいつから使われているのか知りたくて、(42行目の変更がいつされたのか知りたい時)
git blame | grep 42
として使用しました。
関数やある特定の文字列が加えられたときのコミットを調べたいときは、
git blame -L:func_name example.c
git log -p -S 'word_ur_looking' example.c
などとすれば調べられます。他にも正規表現で調べたりなど色々あるので、詳しく知りたい方はman git-blame
などで調べてみるといいかもしれません。
git format-patch
このコマンドはpatchファイルを作成する時に使用するコマンドです。ちょっと話が逸れますが、今回のPostgreSQLのOSSコミュニティではgit
などでissue
を立ててpull request
などを作成して、、、などの現在メジャーな開発方法ではなく、メーリングリストでpatchファイル
を送信し、それを自身のエディタで適応させたのちその変更に対して議論を重ね、最終的に偉い方が本体にマージする、という形の開発でした。なのでpatchファイルを作成してそれをメールで送る際に使用する時に使用するコマンドがgit format-patch
でした。
git diff > example.patch
としてもpatchファイルが作成できるのですが、これだと変更差分のみがpatchファイルに入力されます。
git format-patch -1
などとすると最新の(-1をしているため)コミットメッセージや著者情報などをpatchファイルに入力し、自動的にファイル名を名付けてくれる。(ファイル名はコミットメッセージから作成される)
また、二つや三つの場合は連番にしてくれるので、正式なpatchファイルはこのコマンドで作成されることが多いらしいです。
git apply , git am
これらのコマンドは先ほど作成したpatchファイルを自分の手元で適応する際に必要となるコマンドです。
git apply
は単に変更を取り込むだけのコマンドです。コミット情報などは反映されず、手元で変更を確認したい時などに使用します。
それに対してgit am
はコミット履歴を作成します。つまり、現在の自分のファイルに対して
git am 0001-your-changes.patch
などとすると、0001-your-changes.patch
がコミットされた状況になります。なので、このgit am
コマンドはgit format-patch
で作成した、コミット履歴付きのpatchファイルにしか適用されず、git diff
などで作成されたファイルをgit am
する事はできません。
その他
その他ということで、普段の開発でも使用するであろうコマンドで、今回のインターンでも使用したコマンドも一応記載しておきます。本当に基礎的なコマンドなども一応載せておくので(add, commitなどは流石に飛ばします)、ご確認のために、、、
git reset
このコマンドでは、addやcommitした変更を取り除けます。
簡単にまとめると以下のような感じです
-
reset --hard :add、commit、ワーキングツリーの取り消し
-
reset --mixed:commitとaddの取り消し
-
reset --soft :commitのみ取り消し
git revert
このコマンドは履歴を保持しつつある特定のコミットを新しいコミットで打ち消すことが出来ます。ある特定のコミット以降の変更がそのコミットの変更に依存していた場合などはコンフリクトが起こる可能性があるので、それらは手動で解決しましょう。
まとめ
今回のインターンではメーリングリストでいろいろ作業を行なったため、patchファイルを作成したり、それの変更を適用させたりと、普段ではあまり使わないコマンドを使用しました。ブランチを切って、そこでpull requestの内容を取り込んで、、などとせずpatchファイルを送りあって、それに関して英語で議論しあう、という普段あまりしない体験だったのですが、とても面白かったです!!!