Gitマスターへの道#4~みんなでマージ!~
こんにちは。高須です。このシリーズも4回目ですが、みなさんいかがお過ごしでしょうか。マスターになれていますか。Gitマスターになると高らかに宣言しながら何を言い出すんだという感じでしょうが、私の感触としてはまだまだという感じです。なんか、めちゃめちゃエラー出るし、心が折れます。いまGit内で何が起きている??なんかした??ということがたくさんありました。「使ったことある」だけではなく「使いこなせる」ようになりたいですね。でもこういう苦悩がいつかマスターへとつながると信じてやっていきます。
前回はブランチという機能で、オリジナルのファイルに影響を与えないまま並行して複数の編集作業ができるようになりました。今回はそれらを統合するマージという機能を学んでいきます。
そもそもマージ自体の定義ですが、いろいろ読んでみた結果、ブランチを活用してるか否かに関わらず、リモートリポジトリのファイルを正としてローカルリポジトリのファイルとの差分を取り込むこともマージというようです。ただ今回は、より一般的な「ブランチでの作業が終了したファイルを枝分かれさせる前のmainブランチのファイルに編集した部分(編集前との差分)を統合すること」をマージと定義して話を進めていきます。
繰り返しますが、マージは「枝分かれさせる前のブランチのファイルに統合すること」です。今回の場合はmainブランチにマージするのが正解です。中途半端にブランチ同士をマージしようとするとGitBashが混乱します。
それでは早速やっていきましょう!
以下には前回までの作業状況を置いておきます。
以下には今日のマージしていく計画です。最初mainにcolorをマージして、そのあと試しにhometownにfoodをマージしてみましょう。失敗するので、そのマージをキャンセルし、そのあと順当にmainブランチにすべてマージさせていきます。
では図の通りの順番でやっていきましょう。
①mainにcolorをマージ
まず、枝分かれさせる前のmainブランチに作業ブランチを切り替えます。(前回やったcheckoutを使います)
枝分かれさせる前のmainブランチに統合させるには
$ git merge [branch]
でマージすることができます。
これでmainブランチにcolorブランチの変更が取り込まれ、mainブランチのファイルに質問1の回答が記入されました。
②hometownにfoodをマージ
試しに、hometownに切り替えて、同様にfoodのブランチをhometownに統合しようとしてみましょう。
「CONFLICT」という表示が出ました。これは同じファイルの同じ場所に複数の修正が同時に行われたときに発生するエラーなのですが、そもそも枝分かれ前のブランチに編集した場所との差分を統合することになっているわけですから、どこがどう変わったんだ??とGit側が混乱している、といった状況で、その判断をユーザーに委ねている状態です。
mainのブランチに統合する場面でCONFLICTになってしまったら、対象のファイルを手動で修正して、コミットするようにします。しかし今回の場合は、枝分かれしたブランチ同士をマージしようとしたことによるCONFLICTなので、このマージはキャンセルして、ちゃんとmainのブランチに一つ一つブランチをマージしなければなりません。
②’マージのキャンセル
マージしようとしたらCONFLICTって言われた、キャンセルしたい。そうなった場合には、
$ git merge --abort
でキャンセルされます。
CONFLICT中のブランチには、ブランチ名の横に「MERGING」という表示が出ています。
キャンセルしたあとのブランチ名の横には、MERGINGの表示は消えているので、キャンセルできて、元の状態の戻りコンフリクトがなくなった、ということになります。
③mainにhometownをマージ
気を取り直して、①のやり方に倣い、mainにhometownをマージしていきます。
すると、
見たことない画面が、、、、、
最初はよくわからず諦めモードでGit Bashを無理やり終了させてやり直していましたが、調べてみるとどうやらそんなに大きな問題では無いようです。こちら
言われたとおりに入力して「ENTER」キーを押したら直りました。そしてマージも完了していました。
いいぞ、あと1ステップです。
④mainにfoodをマージ
最後にmainにfoodをマージしていきます。
しかし、コンフリクトが起きてマージできない。今回は先程わたしが説明した言葉を借りるなら、「対象のファイルを手動で修正して、コミットするようにします。」なのですが、なんかややこしいことしちゃって、にっちもさっちもいかなくなりました。
やだあああああやめたいいいいいい全部なかったことにしたいいいいいい
調子よかったのに、なんで最後だけこうなる??あとこのワンステップさえできればこのブログも終わるのに!!なんでよ!!
と、愚痴を言ってもしょうがないので、このブランチのことは忘れて、新たにブランチを作って質問に回答し、保存して、コミットして、mainブランチにマージします。これが大事なソフトウェアのバグ修正とかだったらきっと上司に怒られるんだろうな、、、、でも、やり方の説明自体はできたし、いいよね、、、、
ということで、新計画です。
これでいきましょう。(ごめんなさい)
いままでの学びが活かされるときです、一気に進めてまいりましょう!
これでmainブランチのアンケートが(無理やり)完成しました!
やった~~~!(泣)
まとめ
いかがでしたか?もうポジティブになっていますが、こういう勉強って「よし、できた!」と「やだあああああやめたいいいいい」の連続だなあと思います。このブログの冒頭を書いているときはまさかこんな苦しむことになるとは思っていないのですが、伏線みたいになりましたね。でもこれで諦めるとマスターにはなれないので、このエラーは自分でなんとかしようと思います。
エラーに悩まされながら夢中で書いていたら、逆にリアルでいいブログなんじゃないかな、なんて思っちゃってる深夜テンションの高須がお送りしました。楽しみながら、共感しながら、時には一緒に苦しみながら読み進められるブログをと思って書き始めましたが、ただ最後は無理やりになってしまいましたね、、、まだまだマスターへの道は険しいようです。もっともっと頑張ります。