sci

最果て風呂

ひとり 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 にプッシュしたらボタンを押してプルリクをする。

f:id:nakinor:20151229210207p:plain

続いて先程とは関係しないファイルを修正して(コンフリクトしない)コミットをする。

(面倒なので master のまま)
vim manual.jax ごにょごにょ
git commit -am 'add manual'
git push origin master

これで PR したよりも master が先に行った状態になっている。

f:id:nakinor:20151229210249p:plain

GitHub を見てみると「コンフリクトしていないよ」と教えてくれる。ボタンが緑色だからそのままマージできるみたいだ。

This branch has no conflicts with the base branch

f:id:nakinor:20151229210303p:plain

実験のためここではボタンを押してマージをしない。次に PR で修正しているファイルを修正しつつも同じ行には手をつけない状態で master を先に行かせてみる。

(面倒なので master のまま)
vim manual.txt ごにょごにょ
git commit -am 'add manual'
git push origin master

f:id:nakinor:20151229210312p:plain

同じファイルに対して行なった修正でも、とにかくマージができる状態ならば大丈夫みたいだね。

f:id:nakinor:20151229210321p:plain

Git のこと、良くわかってないなぁ……。もう少し修正を続けてみよう。

PR がコンフリクトした

わざとらしく PR で競合する部分を修正してコンフリクトさせてみる。

f:id:nakinor:20151229210328p:plain

push をしたら GitHub のお知らせ枠が灰色△!になり、下記のような警告が表示された。

f:id:nakinor:20151229005636p:plain

このままではマージができないからボタンも押せないッ!

f:id:nakinor:20151229210336p:plain

This branch has conflicts that must be resolved Use the command line to resolve conflicts before continuing.

リンクをクリックすると(別のページに飛ばされるのではなくその下に)解消方法が示される。すべきコマンドがそのまま書いてあるので、英語のわからない自分でも作業ができるぞ!

f:id:nakinor:20151229005643p:plain

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 でも「マージされたよ」と表示されて終了。あとはブランチを削除して完了だ。

f:id:nakinor:20151229210416p:plain

PR したブランチ側を追随させる

先の作業では、自分が持ち主なのでローカルでマージする方法が表示されていたのだけれど、PR を master の変更に追随させて、権限のある他の人にマージしてもらいたい(コラボレーターでもなく、そのリポジトリに権限が無い場合)。

前回のコンフリクトを解消するところまでは同じ。次に git push origin update-manual としてトピックブランチを更新する。

f:id:nakinor:20151229210355p:plain

すると、GitHub 上で

This branch has no conflicts with the base branch

というメッセージになり、ボタンを押してマージすることができるようになる。

f:id:nakinor:20151229005650p:plain

f:id:nakinor:20151229210408p:plain

その他

自分が「フォークをして PR をするだけの立場」と「コミット権を持っていて PR の動作を確認してマージできる立場」では作業が若干異るのかな?よくわかってないから事故とか起こしそうだし、PR だけしかできないほうが気楽でいい。でも、実際に何度も作業しないと覚えないから、この「独りプルリク作業」は続くのであった。

Fork するタイプの Pull Request - sci を書きました。