【git】masterからトピックを切っていたと思ったら、いつのまにかトピックから切っていた話【origin masterにpushするな】
- TL;DR
- ぜんてい
- リモートの更新をローカルのトピックブランチに取り込む
- NG: ローカルでmasterを更新してリモートにpushする
- 模範解答: Pull Request (Merge Request) を発行する
- 次点: git merge 時、--no-ffオプションを付ける
あ…ありのまま 今 起こった事を話すぜ!
「おれは masterからトピックを切っていたと思ったら いつのまにかトピックから切っていた」
- ※ masterは適宜develop等に読み替えてください
- ※ developはありましたが無くなりました
- (未リリースだしまあ妥当)
TL;DR
- PR(MR)作れ
- 次点で
git merge <branch> --no-ff
しろ - タイトルは半分釣り
- トピックをトピックから切ったように見えるだけ
ぜんてい
gitを用いた開発では、「ブランチ」が開発の単位となります。
いろいろな流儀がありますが、
- 幹から枝を生やして (トピックブランチ作成)
- 枝の上で作業をし (トピックブランチにコミット)
- 枝の作業を幹に戻す (トピックブランチを統合ブランチにマージ)
という大まかな流れは同じかと思います。
こうして形成されるのがコミットグラフです。
ローカルのgitコマンドやGUIツールで確認できますし、
GitHubやGitLabといったGitホスティングサービスを利用している場合、Webブラウザ上でも確認できます。
さてGitホスティングサービスを利用する場合、
「3. トピックブランチを統合ブランチにマージ」
はホスティングサービス上で行うのが普通です。
トピックブランチをリモート(ホスティングサービス)にpushしたのち、
- GitHubならPull Request
- GitLabならMerge Request
を発行し、マージを実行します。
リモートの更新をローカルのトピックブランチに取り込む
さてGitホスティングサービスを利用する場合、
「3. トピックブランチを統合ブランチにマージ」
はホスティングサービス上で行うのが普通です。
逆はこの限りではありません。ローカルでマージするのが普通だと思います。(要出典)
いま、リモートのコミットグラフはこんな形:
ここで、コミットaからブランチfeature/X
を切って作業している人がいたとします
その人はリモートの最新のmaster
を取り込みたいので、git fetch
します:
ローカルのリモート追跡ブランチorigin/master
にリモートのmasterが降ってきました。
「さあfeature/X
にorigin/master
をマージするぞ!」
と、ここまではまあ普通です。
(merge/rebase宗教論争については触れません)
git checkout feature/X git merge origin/master
NG: ローカルでmasterを更新してリモートにpushする
git checkout master git merge feature/X
git push origin master
これはいけない。
masterがなるべく真っ直ぐになるようにコミットグラフが歪められて、こうなる
feature/A
, feature/B
が「トピックブランチからトピックブランチを切った」ような珍妙な形になるわけです
模範解答: Pull Request (Merge Request) を発行する
これに尽きる
次点: git merge 時、--no-ff
オプションを付ける
開発者全員がPR(MR)を発行してくれるのは理想郷です。
偉い人が
「俺がmasterだ!!」
とばかりにgit push origin master
してしまうこともあると思います。
そんなケースでもコミットグラフの治安を守るには、
git merge
コマンドの--no-ff
オプションが有用です:
git checkout master
git merge feature/X --no-ff
git push origin master
--no-ff
とは、「no fast-forward」の意味。
fast-forwardとはマージの一種で、超ざっくりいうと
「差分がない場合はコミットを作成しない」
です。
--no-ff
はその否定(no)なので、「差分がなくてもコミットを作成する」の意味です。
上記のマルと矢印の絵でいうと、コミットz
がno fast-forward commitにあたります。
configで強制することが可能なので、チームのルールに取り入れるとよいのかもしれない。
いやPR (MR)出せや!!!って話なんですけどね!!!!!!