Edited at

【中上級者お断り】初心者のためのgit利用入門

More than 5 years have passed since last update.

私は主業務がインフラなので、共同作業をする相手も同じくインフラなエンジニアが多いです。インフラエンジニアの中には開発経験が浅い、もしくは全く無い人間も少なくないので、scmの扱いはチームの最大公約数、故に原始的で汚くなります。

なので、gitの履歴をきれいに保つために、かんたんに出来るプラクティスについてまとめます。


作業の流れ


1. とりあえずブランチ

諸悪の根源の一つは、master(ないしは更新すべきブランチ)での直接作業です。なので、とにかくブランチを作ります。

お勧めは「今やろうと思っている作業」を単位にすることなので、名前もそれっぽい(make_backup_script_for_wapみたいな)感じで作ります。

$ git branch

# 初期状態
* maser

# ブランチを作って移動
$ git branch kinou_tsuika
$ git checkout kinou_tsuika

# 確認
$ git branch
* kinou_tsuika
master


2. コミットは自由に

ブランチを切っている場合は、いくらコミットしてもとりあえずその中の話になります。なので、コメントを付けつつ気にせずコミットします。

# 編集して

$ vim hogehoge.txt

# commit
$ git add hogehoge.txt
$ git commit -m 'change parameters'


3. 長くなりそうなときはリモートブランチにさくさくpush

作成時間がちょっと長くなりそうだったり、違う端末でも作業をしたい場合は、2の作業結果をちょくちょくpushすると捗ります。

# リモートブランチを確認

$ git branch -a
* kinou_tsuika
master
remotes/origin/master

# 大丈夫そうなので、リモートブランチの作成
$ git push origin kinou_tsuika

# 無事できた
$ git branch -a
* kinou_tsuika
master
remotes/origin/master
remotes/origin/kinou_tsuika


4. 履歴をきれいにまとめる

ここまでではリモートブランチを使う場合もメインでないブランチです。つまり、閉じた世界なのでどこにも反映されません。というわけで、反映してみます。

# メインのブランチに切り替えて

$ git checkout master

# ひとまず最新に更新して
$ git pull origin master

# 自分の変更分をsquashで取り込んで、再コミット
$ git merge --squash kinou_tsuika
$ git commit -m 'kinou_tsuika done'

# きれいになったコミットをpush
$ git push origin master

# 後始末のブランチ削除
$ git branch -D kinou_tsuika
$ git push origin :kinou_tsuika


まとめ

要点はこれだけです。これならできませんか・・・?


  • こまめにbranchをつくる

  • remote branchも気軽につくる

  • remoteへのpushは--squashなmerge後に


【番外編】失敗からの回復方法


ブランチ作るの忘れちゃった

気付いたらmasterとか、直接更新しないはずのブランチを更新しちゃってた場合

# コミット未遂

$ git status
変更内容がずらずら…

# 現在の変更内容を一時保存(コミットではない)
$ git stash

# 急いでブランチを作り直して
$ git branch hoge
$ git checkout hoge

# 一時保存したやつを戻す
$ git stash pop


ブランチ壊しちゃった

masterブランチがえらいことになった。自力でなおせない。。。

# mergeに失敗してmasterが壊れた。。。

$ git branch -a
master
* kinou_tsuika
remotes/origin/master

# 壊れたローカルのmasterを消す!
$ git branch -D master

# そして再生
$ git checkout -b master origin/master
$ git branch
* master
kinou_tsuika
remotes/origin/master