こんにちは、今回は真面目な話です。(期待していた方はすみません。)
※初心者向けなので、ギットチョットワカル人は業務に戻ってください。
対象
- stash使えるようになりたい人
- add, commitを取り消したい人
- GitHubじゃなくてコマンドで色々参照したい人
- 暇つぶししたい人
Gitを操作する際、Gitクライアントソフト(Source Treeなど)を使っている方も多いかもしれませんが、
業務上、どうしてもターミナルでGitコマンドを利用する必要性が出てきます。
今でもコマンド操作で、なんかおかしくしちゃったりよくするので、
gitのコマンドを全部調べてみました。(意外と結構ある)
過去にも似たような記事がありましたが、今回は、
業務にも有用そうなものをコマンド別に、わかりやすく?説明してみようと思います。
(※正確な説明ではないところがあると思うので、注意です!)
git stash
いろんな作業を並行していると他のブランチにチェックアウトできない!などが発生しますよね。
git stashしてください。
git stash初めての人
2個だけ覚えていってください。
一時的に退避
$ git stash
退避した内容を元に戻す
$ git stash pop
上記を行えば、「一旦退避しといて、ブランチをcheckout 後、元に戻す」とかできます。
ちょっと詳しい説明
退避するときにコメントを追加
$ git stash save [comment]
stashされてるリストを表示
$ git stash list
stashの概要を表示
$ git stash show [index(listで出てくるstash@{0}とか)]
stashのindexを指定して元に戻す
$ git stash apply [index]
上でapplyした場合、listからは消えないので、削除する。(popなら削除もされる)
$ git stash drop [index]
git reset
間違えてaddしてしまった!間違えてcommitしてしまった!などで役立ちます。
毎回ググってよくわからずコマンドをコピペしてる人は、以下の2つを理解したらOK。
3種類のresetオプション
- オプションなし(または –mixed)(commitとaddに影響)
- –soft (commitのみに影響)
- –hard (commitとaddとワーキングツリーに影響)
HEAD(ブランチの場所を指し示すもの)
- HEAD(現在のコミットの場所と思っておいたらいい)
- HEAD^(ひとつ前のコミットの場所)
- (何個前とか絶対参照もできるけど、あんまり使わない気がするので必要ならググってください)
addを取り消したい場合
$ git reset
これは、以下の略です。
$ git reset --mixed HEAD
つまり、「オプションなし(–mixed)だから、add,commitに影響。commitをHEADの位置にし、addもHEADの位置にする。」
=addのみしている場合、commitしていないため、HEADの位置は(コミットは)動いていない。
だから、「addのみを取り消す」という意味になる。
commitを取り消したい場合
commitもaddも、ひとつ前に戻したい
$ git reset HEAD^
addもcommitもしている場合、HEADはひとつ動いているため、HEAD^を指定する。
→ オプションなしなので、addもcommitもHEAD^に移動する。
commitのみ取り消して、addはそのままにしたい
$ git reset --soft HEAD^
つまり、「–softを指定しているので、commitのみに影響。commitをHEAD^(ひとつ前のコミット)の位置にする」
(–softの場合、addの状態は変わらない)
ローカルでの変更内容を破棄したい場合
すべて、ひとつ前のコミットの状態に戻したい(変更はローカルファイルからも消え去ります)
$ git reset --hard HEAD^
「–hardを指定しているので、add,commit,working_treeに影響。すべてをHEAD^(ひとつ前のコミット)の位置にする。」
まだコミットする前だけど、やっぱりローカルの変更を全部消し去りたい
$ git reset --hard HEAD
addもcommitもしていないなら、working_tree(ローカルの変更)のみがHEAD(現在のコミット)の位置に移動する。
git reset –hardするなら覚えておきたいgit reflog
git reset --hard
したら、git logからも見えなくなります。
$ git reflog
なら、HEADの移動の履歴が追える。もしかしたら、以下のようにしたら戻せるかも?(保証はしない)
$ git reset --hard HEAD@{No}
その他少し便利なコマンド
grep
git grep [pattern]
gitのファイルをgrepする場合、通常のgrepで検索するより速い。
log -L
git log -L [start],[end]:[file_name]
file_nameのファイルの、start行からend行までの変更履歴を表示する。
この変更どういう経緯やねん、ってときに使える。
show
git show [commit_id]
指定したコミットの変更を見る(GitHub見てもいいけど)
git show [branch_name]:[file_name]
別のブランチの特定のファイルを参照する。(わざわざcheckoutめんどいとき)
cherry-pick
git cherry-pick [commit_id]
指定したcommitを取り込む(現在のHEADにマージする)
例えば、ブランチごとマージすると色々混じってしまって困る場合、欲しい箇所だけマージすることが可能。
merge –squash
git merge --squash
マージするときに、マージ元のコミットを一つにまとめることができる。
origin/feature と commit1, commit2, commit3の差分がある場合、それをまとめて、差分を取り込む。それを commit4 としてコミットできる。
例えば、自分の作業用ブランチで荒れたコミットを一つにまとめたり、整えるときに。
(注意)あくまで、別のコミットとなるので、diffで参照すると、コミットの差分は発生します。
いつか使えそうなコマンド
bisect
$ git bisect start [なんかおかしくなったコミットID] [正常だった頃のコミットID]
どのコミットで、なんかおかしくなったのかを高速に探す。
(自動で二分探索を使ってコミットにチェックアウトして、テストを繰り返して原因のコミットを特定する)
$ git bisect run [test_file]
で、テストファイルを指定するか、手動テスト後、どちらかを実行します。
$ git bisect good
$ git bisect bad
今のコミットを見る
$ git bisect view
git bisectを終わりたかったら、
$ git bisect reset
Tips
以上を全部理解しちゃったら、以下の設定をして、さらに快適にGitを使ってください。
エイリアス登録
Gitのエイリアスを登録していない人は、登録すると少し幸せになれます。
checkout を co としたところでなんなん?と思っていましたが、結構快適です。
$ git config --global --edit
viが開くので、以下を追記
1 2 3 4 5 6 7 8 9 |
[alias] st = status br = branch ci = commit co = checkout |
これで、例えば、$ git st
で、git status
が見れます。
まとめ
これでGitの操作も完璧ですね。
実は、Source Treeとかの使い方がわかりません。