コマンドラインでGitを使うようになったので色々メモ


はいどーも!

今まではずっとSourceTreeでしたが、
最近はコマンドラインでGitを使うようになりました。
GUIだと見やすくて操作しやすいですが、自分が何をしてるのかよく分からずとも操作できる部分がありました。
コマンドラインだと自分が何をしてるか分からなきゃ操作できないものが比較して多いので、
コマンドラインでGitを操作することで初めてGitとはなんぞや、何しとるんじゃを理解し始めた気がします。

 

よく使うコマンド達

 

以下、gitコマンドについて思うことを一つずつ書いてみます。
()はgit configのaliasで[]はbasrcのaliasで、自分で設定してるやつです。
 

$ git status
(git st)[gst]
何をするにしても常にこれを打ってます。
何はともあれgst。変更ないかだけ調べるときは–shortもよく使います
 

$ git add
(なし)[gad]
一度addしたやつ戻したかったらgit reset HEAD そのファイルorディレクトリ
 

$ git commit
(git ci)[gci]
-m “何か”でコミットメッセージも同時に書けますが、
コンフリクト解消した後に-mやっちゃうとマージメッセージ上書いちゃうのマジ罠です。
 

$ git fetch
(git fe)[gfe]
gfeは”git fe -p”で、常に-pつけてます。綺麗好きです。
gfeも気づいたらいつも打ってるコマンド
 

$ git merge
(git me)[gme]
gmeは”git me –no-ff”で常にノンファーストフォーワードにしてます。
マージコミットは常に作ってれば安全ですね。
とはいえマージコミットが大量にあると超鬱陶しいですが
git log –no-merges
とかでなんとか回避..
 

$ git mergetool
(なし)[なし]
全く使ってないけど思い出したのでついでに..
何回か試して使いこなせなかったやつ。
コンフリクトしたらvimでHEAD検索してごにょごにょするで今のところ安定
 

$ git branch
(git b)[gb]
現在のブランチはプロンプトに常に表示してるので、
使うのはブランチ切り出す時とブランチ一覧で見たい時とか
最近教えてもらった–mergedオプションでマージ済みのブランチ表示が良い感じです
 

$ git checkout
(git co)[gco]
ブランチ切り替える時だけでなく、
いらん変更差分を消すのにも使うので使用頻度タカシですね
 

$ git diff
(git di)[gdi]
こいつはめちゃめちゃ優秀だと思います。
もうなんでもできるのではという感じです。
ブランチ指定での比較、コミットハッシュでの比較、ファイル指定での比較、日付の指定までも..
頼りになります。
 

$ git pull
(なし)[gpull]
git fetchとgit mergeを混ぜただけのやつ。
–rebaseでpullするのが良さそうという話がありますが、
大量にコミットがあってコンフリクトしまくった時、コミット一つ一つでコンフリクト解消していかなきゃみたいなのが恐ろしき..
 

$ git push
(なし)[gpush]
初めてリモートにpushするブランチは-uつけておけば、
追跡ブランチに紐付けられて、以降は”origin ブランチ名”は省略可なのが良いですね
(configのpush.defaultがどうなってるか注意。simpleが安全のはず)
挙動が不安なときは-nオプションつけてdry run!
 

$ git log
(なし)[glog]
ログは生命線ですね
git log –graph –name-status –abbrev-commit
これをglogに登録してます。
オプションは-p、–author、–grepをよく使います。
–since、–untilとかもあってオプション無限ですね。
 

$ git blame
(なし)[なし]
「この行誰がいつ何のコミットで追加したんじゃ…」
を見れるのが非常にナイスですね。
ただネーミングがblameなのが若干物騒です
 

$ git stash
(なし)[なし]
めちゃ便利。
一時退避させたいことはままあるので、結構使います。
SourceTree使ってるときはこんなことできるなんて知らなかった..
 

$ git revert
(なし)[なし]
特にコメントなし
 

$ git reset
(なし)[なし]
configのaliasにcancel=’reset –soft HEAD^’
ってやるの良い気がしつつもやってない..
 

$ git show
(なし)[なし]
コミット詳細見れて便利、以上。

$ git rebase
(なし)[なし]
よく使うコマンドではないけど備忘録。

【挙動】
カレントブランチ: topic
rebase対象ブランチ: master

以上の状況で、
git rebase master
した場合以下の挙動になる。

1. masterブランチからtopicブランチを切り出した後のコミットが一旦退避され、git reset –hard masterした状態になる(topicブランチをmasterブランチで上書いた状態)

2. その後、退避されたコミットをtopicブランチに一つずつgit cherry-pickした状態になる(退避されたコミットのコミットハッシュは書き換わる)

【mergeと比較】
メリット
・コミットグラフが綺麗になる(OSSにプルリク送るときはrebaseしてから送るのがマナーらしい)
デメリット
・すでにpushされたブランチをrebaseするとpushできなくなる
・「rebaseした」という履歴が残らない
・コンフリクトしたらコミット毎に解消する必要があったりする(mergeだと解消は一回)
参考:
『こわくない Git』 (https://www.slideshare.net/kotas/git-15276118)
『git pull と git pull –rebase の違いって?図を交えて説明します!』 (http://kray.jp/blog/git-pull-rebase/)
 

HEADとダブルピリオド

 
コマンドではないですが、こいつらについても今後忘れないように書いておきます。

HEADはカレントブランチの最新コミットですね。
HEAD^はその一個前。^を増やせばどんどん遡れるっぽい
gitのv1.8.5からはHEADじゃなくて@でも同じ意味を持つらしいです。便利。
初めて見たとき訳わかんなかったダブルピリオド「..」ですが、
git log master..topic
とかした場合、masterからtopicを切り出した後のtopicブランチでのコミットだけ見れるよう。
うまく使っていきたいです。
参考: 『GitのHEAD^ HEAD~やらダブルドット トリプルドットやら』
http://tech.aainc.co.jp/archives/6740
 

 

まとめ

 

もうGUIに戻れない気がします。
CLIで出来れば汎用性めちゃ高いし、「俺TUEEE」感もありますし。
何よりオプションがめちゃあって小回り利くし自分用にカスタマイズしまくれるのが素晴らしいですね。
これからもじゃんじゃんCLIでGitをいじっていってみます。
次はsqlもCLIで..

 

おまけ

 

$ git config --global -l

 
$ cat ~/.bashrc

 

Comments are closed.