Gitおさらい:リモートリポジトリからのpull(merge)とfetch&rebase

事のキッカケはこれ。



今回はGitHubの話じゃ無くてGitの話。先月仕事で使っていたGitのリポジトリがリモートリポジトリ=セントラルリポジトリで、みんなそれをcloneしておのおのpush&pullするって使い方をしてたわけ。それがgit的に良い運用かどうかは知見不足でなんとも言えないのだけど、やたら目に付く"Merge branch 'master' of..."というコミットログが見た目によろしくないなぁと思ったわけ。


歴史改ざんこそGitの利点とばかりに、masterブランチのコミットログはキレイにしたいなぁ、なんて思いにとらわれてたので、なんか気になって仕方なかった。別に大したことないと思えば、それまでなんだけどね。:-)


川口さんにアドバイスしてもらった "git pull --rebase" をIntelliJで行うべく、あれこれ模索してて、ついにその方法を見つける!



...も、あらかた作業が終わった後に次の事実にも気づいた。orz



そんなわけで実際に復習してみる。前回キレイにしたリモートリポジトリのブランチ:kotlinを第三者が育て(3)といて、自分のローカルリポジトリでも別に育てとく(4)。こんな状態がスタートライン。


リモートリポジトリと同期とってないので、IntelliJのChangesツールウィンドウには、自分んとこのコミットグラフしか見えてない(リモートの(3)が見えてない。


この時点で、VCS->Git->Fetchを実行して、Changesツールウィンドウを更新するとこうなる。


IntelliJが裏で実行したgitコマンドは、これ。別に必ずしもpull前にFetchしなきゃダメって事はないけど、安心感があるのでFetch大好きっす!

git fetch https://github.com/masanobuimai/tsubunomi.git +refs/heads/*:refs/remotes/origin/*


んで、まずはMerge。Git専用メニュー(VCS->Git)であれこれ小細工しないで、VCS->Update ProjectのダイアログでMergeを選ぶ。


そして実行。裏ではこんなコマンドが実行される。

git merge --no-stat -v origin/kotlin


それでどうなるかというと、こうなる。


IntelliJのChangesツールウィンドウからみると、こう。


この"Merge remote-tracking branch ..."とかってのが、なんか好きになれない。別の言い方をすれば、このコミットログをなんとか出来れば pull&merge でも構わない(今はもうそんなにこだわってないから、実はどうでもいいw


これをなんとかしたいなってんで、pull&rebaseを試してみたのが、こっち。「IntelliJでpull&rebaseできない、できない」言ってたら、普段使いのUpdateダイアログにちゃんと載ってた。(´・ω・`)


こちらを実行すると、こんなコマンドを叩いてる。

git rev-list -1 kotlin..origin/kotlin
git rebase origin/kotlin


このコマンドがなにをどうよろしくやってくれるかは知らないが、結果こんなコミットグラフになるよ。


Changesツールウィンドウはこうなる。


gitのpush&pullの収まりの悪さってのは、つまるところセントラルリポジトリの運用がよく分かってないに尽きるかなと思ってる。どうもsvn的に考えちゃうんだけど、たぶんgitはgitに向いた運用があるんだと思う(そもそもリモートリポジトリがセントラル用ひとつでいいのか?あたりから疑問ガガガ...。


git-flowとかより良いやり方もあるのかなーと不勉強ながらもやもやしてるのだけど、そんな苦労するなら別にsvnでいいじゃんか、と囁く自分もいるよ。がしかし、すでに私のモチベーションは「IntelliJがgit/GitHubをサポートしてるから覚える」になっているから、細かい事はどーでもいいw