社内でGitLabを使い始めました。個人レベルでPC間のファイル同期用途としては以前から使用していたのですが、実務かつ複数人で使い出すと操作に困ることが多かったので、『このときはこう!』というのを書き残していきたいと思います。
そもそものブランチの使い方
これには正解はないが、今のところGitLabFlowをベースにしてこんな感じのルールにしています。
リモートリポジトリにはmasterとstagingとproductionを用意。masterは最初からずっと、stagingとproductionは初回リリース以降はずっと存在し続ける。作業は、masterから要件単位にfeature/xxxブランチを切って行う。
ローカルの作業はfeatureブランチで行い、コミットは各自のタイミングで。単体テスト終わるまではそのまま。テスト完了したものをpushし、masterブランチにマージリクエストする。
ある程度の区切りで、masterブランチをstagingブランチにマージして、ステージング環境での動作確認や顧客デモを行う。
実際のリリースタイミングでproductionにマージしてバージョンタグ(v1.1.0など)を付けています。
このときはこう
ローカルリポジトリで細かくコミットしているが、細かすぎるのでまとめたい
ローカルリポジトリのコミットは個人の自由なタイミングで行っています。ですが、1つのfeatureの実装が終わり、ソースレビューに出すときなどに、細かなコミット多いとログインが汚れるし、レビューする側も見づらいです。
そんなときは、複数のコミットをrebase -i でまとめます。
$ git rebase -i
出力イメージ
pick 9dfab7ac 〇〇機能追加しました
pick c04aced8 レイアウト調整
pick ee35f7dc テストコード追加
エディターが開き、コミットが古いものから順にリスト表示されるので、pickをsに変更する。
ブランチ切って開発中に、リリース済みのバージョンに緊急対応が発生したとき
作業中ブランチでは緊急対応しないこと。masterからhotfixブランチを切って、対応してmasterにマージする。masterには、前回のリリース以降に開発した、未リリースのfeatureがマージされている可能性があるので、hotfixのマージコミットだけをcherry-pickして適用する。
作業中のブランチに、他の人のコミットを取り込みたいとき
他の人のコミットをすべて取り込んで、最新のベースに合わせるときは、rebaseをする。
hotfixブランチで対応したものだけを、開発中のブランチに取り込むには、cherry-pickを行う
戻したい系
コミットを取り消す
コミットを取り消すには、reset(リセット)を使う
- コミット操作を取り消す(変更内容を未コミットに戻す)
$ git reset --soft HEAD^
$ git reset --hard HEAD^
取り消したことを取り消す(直前のリセット操作を取り消す)
$ git reset --hard ORIG_HEAD
プッシュを取り消す
$ git revert
$ git push
マージを取り消す
- マージしようとしたらコンフリクトして編集もしたけど諦めてやっぱりやめたいとき
$ git reset --hard HEAD
$ git reset --hard ORIG_HEAD
$ git revert -m 1 <マージコミットのID>
GitKraken
Git操作にGUIツールとしてGitKrakenを使っているので、そちらについてもメモ。
リベース操作
GitKrakenでリベース操作をする際に、いつもいつも操作を間違えるのでメモを残しておきます。
dev, topicの2つのブランチがあって、topicブランチで開発中にdevがけっこう伸びてきたのでリベースしたい。topicはまだ開発中なので、マージするのではなく、最新のdevを取り込んでおきたい。
操作
- topic/XXXブランチをチェックアウトする
- devブランチ上で右クリックし、"Rebase topic/XXX onto dev" を実行する
- コンフリクトなどに適宜対応し、完了する
まだまだカバーしきれていない「こんなときどうするっけ?」がありますので今後も更新していく予定。
プッシュする前にコミットをひとつにまとめたい
こちらもリベースを使います。
ローカル作業中に、ちょっと大きなリファクタリング着手する前とかで自由にコミットできるのがGitのいいところです。しかしながら、そのままプッシュすると、『リファクタリング前にいったんコミット』『テストコード修正』『修正コメントを追記』みたいに、ちょっと散らかったコミットログになってしまいます。
リベースを使うことで、プッシュする前に複数のコミットをひとつのコミットにまとめてからリモートに反映することができます。
操作
- まとめたいコミットたちの先頭のコミットのひとつ前のコミットを右クリックする
- interactive rebase ... を選択
- 対話リベース画面が開くので、上から全てsquashに変更する。一番下のみrewordにする
- 実行する