Fork と Pull Request は対になっている GitHub の機能で、Fork は「ちょいと拝借いたしますよ」、Pull Request は「いじってみたんで見てちょーだい!」ということだと理解しました。Fork すると自分のところに Fork 元の一式がコピーされるので、コミットしてプッシュして Pull Request どーん!!
と、ここまでは順調だったのですが、2 回目の Pull Request を行いたい場合 Fork 元のファイルは自分が 1 回目に Pull Request を行って MERGE された時点より後にさらに変更があったとします。手元のファイルを最新の状態にするにはどうすんの!!というのが今回のテーマです。
Twitter で聞いてみた
「GitHub で Fork 元と自分のところにあるやつが違ってるときはどうすれバインダー」鍵なので埋め込みできないしょんぼり
@riszw もとのやつをpullして自分のレポにpushすれば良いと思います
— ポンコツTatsuro Yasukawa (@SushiYasukawa) March 27, 2014
ここで方向性が見えてきた!安川さんありがとう!!しかし出てくる情報は黒画面でコマンド打てというものばかりで、Coda 2 で何をしたらいいのか全くわからない。
黒画面で打てばいいんでないの
そもそも Coda 2 は Git に対応しているのであって GitHub に対応しているわけではない。Fork や Pull Request は GitHub の機能だから Coda 2 で設定などあるわけない!ということに気付きまして、Coda 2 の黒画面を使えば一応 Coda 2 内で完結してるよねー。と無理やり納得して黒画面に向かったわけですよ。
いでよターミナル!!(ずずーん
upstream の設定
Syncing a fork という GitHub のヘルプページを発見。upstream を設定して Fetch してから MERGE しなって書いてある。
$ git remote -v
origin https://github.com/xxxxx/xxxxx.git (fetch)
origin https://github.com/xxxxx/xxxxx.git (push)
origin しかないことを確認して、
$ git remote add upstream https://github.com/ooooo/ooooo.git
Fork 元のレポジトリを upstream に追加して、
$ git remote -v
origin https://github.com/xxxxx/xxxxx.git (fetch)
origin https://github.com/xxxxx/xxxxx.git (push)
upstream https://github.com/ooooo/ooooo.git (fetch)
upstream https://github.com/ooooo/ooooo.git (push)
増えてる!
Fetch と MERGE
ファイルを持ってこーい!という指示をします。
$ git fetch upstream
Fork 元のファイルを取ってきて、
$ git branch -va
確認して、MERGE するんだけど場合によってやり方が違う。
$ git checkout xxxxx
$ git merge upstream/xxxxx
こっちはローカルで変更を行っている場合に、
git merge upstream/xxxxx
こっちはローカルで変更を行っていない場合に使う。いずれも xxxxx はブランチの名称。
自分の Fork 先にプッシュする
ローカルには Fork 元の最新ファイル一式が飛んできたわけだけど、GitHub 上は MERGE 前の情報が残っています。ここからはターミナルを離れて Coda 2 の GUI を使うよ!
Push ボタンから origin を選択してぽちっとな。GitHub のページを開くと Fork 元と Fork 先(自分のところ)が同じになっています。これで完了!!次からは upstream の設定は済んでいるので、Fetch と MERGE のみ行います。
MERGE と marge
ここまでなぜ MERGE と大文字表記したかというと、最後の MERGE が何度やってもうまくいかず、むっきーとなっていたらこんなログが目に入り…
$ git marge upstream/xxxxx
git: 'marge' is not a git command. See 'git --help'.
Did you mean this?
merge
$ git marge upstream/xxxxx
git: 'marge' is not a git command. See 'git --help'.
Did you mean this?
merge
$ git marge upstream/xxxxx
git: 'marge' is not a git command. See 'git --help'.
Did you mean this?
merge
$ git marge upstream/xxxxx
git: 'marge' is not a git command. See 'git --help'.
Did you mean this?
merge
$ git marge upstream/xxxxx
git: 'marge' is not a git command. See 'git --help'.
Did you mean this?
merge
あ、あれ…?(つд⊂)ゴシゴシ
Did you mean this?
merge
「もしかして:merge」
もう絶対 MERGE の綴り忘れないわ一生!!ちなみに marge はマーガリンのことらしいですよ。Did you mean 〜 も忘れない!!(´;ω;`)