ひとり Pull Request その少し先へ
ちょっと前から GitHub で独りプルリクエストの練習をしてきたのだけれど、もう少し先に進んだことをやろうと思った。それは「コミットがコンフリクトしてしまった際に解消する手順を練習する」ってこと。つまり、自分が PR をして、マージされる前に master が先に行ってしまった場合にどうすれば良いのか?という話。
PR はコンフリクトしていない
同じファイルには手を付けず、コンフリクトしない状態ではあるけれど、PR した時よりも master が先に行ってしまった状況を作ってみる。
git checkout -b update-manual vim manual.txt ごにょごにょ git commit -am 'update manual' git checkout master git push origin update-manual
GitHub にプッシュしたらボタンを押してプルリクをする。
続いて先程とは関係しないファイルを修正して(コンフリクトしない)コミットをする。
(面倒なので master のまま) vim manual.jax ごにょごにょ git commit -am 'add manual' git push origin master
これで PR したよりも master が先に行った状態になっている。
GitHub を見てみると「コンフリクトしていないよ」と教えてくれる。ボタンが緑色だからそのままマージできるみたいだ。
This branch has no conflicts with the base branch
実験のためここではボタンを押してマージをしない。次に PR で修正しているファイルを修正しつつも同じ行には手をつけない状態で master を先に行かせてみる。
(面倒なので master のまま) vim manual.txt ごにょごにょ git commit -am 'add manual' git push origin master
同じファイルに対して行なった修正でも、とにかくマージができる状態ならば大丈夫みたいだね。
Git のこと、良くわかってないなぁ……。もう少し修正を続けてみよう。
PR がコンフリクトした
わざとらしく PR で競合する部分を修正してコンフリクトさせてみる。
push
をしたら GitHub のお知らせ枠が灰色△!になり、下記のような警告が表示された。
このままではマージができないからボタンも押せないッ!
This branch has conflicts that must be resolved Use the command line to resolve conflicts before continuing.
リンクをクリックすると(別のページに飛ばされるのではなくその下に)解消方法が示される。すべきコマンドがそのまま書いてあるので、英語のわからない自分でも作業ができるぞ!
Step1 の 1. と 2. は(自分が持ち主なので)すでに存在するので、PR をしたローカルブランチ(update-manual)に移動して 3. の作業をする。git merge master
をするとシェルに下記の注意が表示される。
CONFLICT (content): Merge conflict in doc/manual.txt Automatic merge failed; fix conflicts and then commit the result.
コンフリクトしているファイル doc/manual.txt
を開くと、コンフリクトしている部分が下記のように示されている。これを解消すればいいんだね。なんだか patch をあてて Hunk った時みたい。
<<<<<<< HEAD ======= eigo muzukashii desu. >>>>>>> master
ここ(GitHub の説明)には書いてないけれど、Step 2 に行く前にちゃんと commit
しておかなければいけない。これはブランチで作業している時にちゃんとシェルに下記のように表示されている。
You have unmerged paths. (fix conflicts and run "git commit")
追跡していない新しいファイルがある可能性があるので、git commit -am 'hoge'
を使うのではなく git add
としてからコミットをした方がいいかもね。
Step2 の指示どおりに master に移動してから git merge --no-ff use-if-no-try-catch
を実行すると Vim が開いてコミット画面が表示されるので、そのまま :wq
する。そうすると下記のメッセージが表示されて push
する準備が整う。
Merge made by the 'recursive' strategy. doc/manual.txt | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-)
晴れて git push origin master
をすると、GitHub でも「マージされたよ」と表示されて終了。あとはブランチを削除して完了だ。
PR したブランチ側を追随させる
先の作業では、自分が持ち主なのでローカルでマージする方法が表示されていたのだけれど、PR を master の変更に追随させて、権限のある他の人にマージしてもらいたい(コラボレーターでもなく、そのリポジトリに権限が無い場合)。
前回のコンフリクトを解消するところまでは同じ。次に git push origin update-manual
としてトピックブランチを更新する。
すると、GitHub 上で
This branch has no conflicts with the base branch
というメッセージになり、ボタンを押してマージすることができるようになる。
その他
自分が「フォークをして PR をするだけの立場」と「コミット権を持っていて PR の動作を確認してマージできる立場」では作業が若干異るのかな?よくわかってないから事故とか起こしそうだし、PR だけしかできないほうが気楽でいい。でも、実際に何度も作業しないと覚えないから、この「独りプルリク作業」は続くのであった。
Fork するタイプの Pull Request - sci を書きました。