gitコマンドと自分メモ

はじめに

自分がgitで使っているコマンドを列挙している。
もう2,3年これより増えても減ってもいないし増やすモチベーションもない。
自分がgitを使いこなせているのか...みたいな話は人それぞれだと思うし、僕も自信はないんだけどgitはそこまで使いこなせなくてもいい道具の一つだとも思う。
なのでまあ、一人のしょぼいエンジニアはgitをただ使うにあたってこのくらいの知識で終わっているということ。
2018年に書くようなことでもないんだけど...2年くらいQiita teamの下書きに埋もれてたのでこっそりと。

init

ここから始まる...んだけど何かのコードを書き始めたあとにこれで始めてしまうと.gitignoreとかLICENCEとかをコピペしてくることになるのがめんどくさかったり。
githubに置く場合はgithubのUIから新しくリポジトリを作ってそれをcloneして始めた方がたぶんいい。

clone

ここから始まる。 githubからcloneするときはssh経由か、http経由かが、URLによって変わるので注意。
認証が必要なリポジトリをcloneしてくる場合は、自分の使用している認証方法と合わせないと面倒なことになるはず。
認証方法は鍵交換方式を使う方法とアクセストークンを発行してパスワードのところに入れる方法がある。
基本的には鍵交換方式のほうが楽。

status

手癖。

branch

新しいブランチを切る。けどあんまり使わない。
というかgit checkout -bでブランチ切るのと移動を一度にやることが多い。
-Dのオプションで消すことは多い。

checkout

ブランチを移動する。
-bをつけてブランチを切るのと移動を一度にやることも多い。
このコマンドは、ファイルやディレクトリを指定することで、変更を何の痕跡も残さず消去することができるコマンドでもあるので油断ならない。

add

変更したファイルをステージングに上げるコマンド。
ステージングに上がっているファイルがある状態でcommitをするとコミットされる。
commitの粒度に気をくばる時は、-pもよく使う。
基本的にaddのあとはすぐにcommitするので、ステージングから取り下げることはあまり無いんだけど、2ヶ月に一回くらいそういうことがある。
そういうときは$ git reset HEAD /path/to/hoge

commit

ステージングに上がっている変更をcommitする。
ほとんどの場合に-mをつける。

push

コミットをリポジトリにpushする。
hotfix的な作業をローカルのmasterとかで作業してしまった後はpush master:hotfix-branchはよくやる。
-fは自分しか触らない作業ブランチでは当たり前のようにやりまくる。
過去に一度だけpush -f masterをしたことがあるが、最近はリポジトリの設定で出来なくなった。

pull

手元のブランチから進んでいるコミットをリポジトリから引っ張ってくる。
developとかmasterとか、一本になっていることが分かっているブランチではやるけど、それ以外の場合は
git checkout -b origin/hogehoge
みたいにやることが多いのであまり使わない。

stash

手元の変更をスタックに突っ込む。
$ git stash popで戻せる。
泥臭いことをやる必要がある時は無限にある。

fetch

リポジトリにあるリモートブランチを更新する。
pullより使う。--pruneも定期的に行う。

rebase

とてもよく使う。
作業ブランチのマージされていないコミットを指定したブランチの先に付け替える。
主にマージ可能にするために使う。
卑近な例だとXcodeは.pbxの形式が、すぐマージ不可能になったりするので、rebaseをするとmergepbxが頑張ってくれる。
あとはもちろん、多数のコミットをまとめて一つにしたいときにも使う。

merge

githubにやってもらうものでほぼ使わない...。--no-ffがなんだったかとかもう忘れた。

reset

手元にconfilict状態のファイルなどが発生して身動きとれなくなったときにgit reset --hard HEADとかはよくやる。
あと、コミットまとめてなかったことにしてadd前にするのもやる。
git reset HEAD^
git reset HEAD~5
とか

log

もちろん見るのにも使うが、コミットのハッシュをコピリたい時にも使う。

revert

あるコミットを相殺するコミットを作ってくれる。
複数人でメンテしている場合はこういうことをちゃんとやって整合性を保つ必要があるのでコミットの粒度に気を配らなければならない。

cherry-pick

別のブランチから対象のコミットを今いるブランチに付け替える。
謎のブランチでコミットしてしまったのに気付いた時はこれで。

remote

originとか、push先のリポジトリ名とそれに対応するURLを見たり追加したり。
現在設定されているのを見ることができる-vが重要。
cloneでhttpssshかを間違えていたらこれで設定し直すこともできる。
herokuにアップしているリポジトリgithubにもホストしたりとか。

diff

現在の変更を見る。

show

直近のコミットとか、指定したコミットの内容を見る。

rm

ファイルの削除の差分をステージングに上げるコマンドだったと思うんだけど、知らないうちにaddで入るようになっていた気がする。

mv

やりたいんだけど忘れる。
勝手に見つけてくれることが圧倒的に多い。

grep

使う。このコマンドが使いたいためにgitを使っているのかも。

reflog

困ったときに使う。あらゆる操作が追跡されていて
git reset --hardと共に使うことでその地点に戻ることができる。
git checkoutで消し去った変更は戻らない。

その他

gitignore

githubが公開しているやつでだいたい足りる。

コンフリクト

起こらないように作戦を立てる。複雑なやつは諦める。

alias

あんまり多くない
status -> st
branch -> br
checkout -> co
rebase -> rb
fetch -> fe
commit -> ci

bitbucket

趣味コードでAPIトークンやらがベタ書きされたソースを置いておく場所。

終わりに

僕が働き始めた時が、ちょうどgitやgithub使っていこうぜみたいな流れになり始めた頃で、こういうのを使うのが初めてだったこともあって覚えるのにはそんなに苦労しなかった。
それは、良くも悪くもこの方(http://qiita.com/kaityo256/items/81e7951a1ca2706955a4 )と同じように立派なgit脳が出来上がってしまったということを意味していると思う。
たぶん今後gitより良い、gitではない何かが流行ることがあれば、頭の中でここに書いてあることを思い浮かべてから変換する人生を送るのだろうなあ。