XXとしてる
2019年3月24日日曜日
Gitの衝突とマージ
今作っているものはGitでmasterとdevelopでブランチを分けて作業している。 なのであるタイミングでdevelopの内容をmasterへマージするのだが、マージコンフリクトが起きてしまった。
またかよっ!
そもそも一人で作っているのになんでmasterとdevelopでコンフリクトが起きるんだよっと思ったら、 うっかりマスターに変なコミットしてしまって、git revertで打ち消していたことを思いだした。
ハハッ、やっちまったな!
.
.
.
.
.
.
git reset --hardで強制的に消しても良かったけど、なんとなくそのままにしておいたツケが回ってきた感じである。 ## rebaseよりmerge こういった問題に直面したとき自分はgit rebaseとgit push -fを使っていたが、 コミットログが消えてしまうのは困ることに気がついてからマージでなんとかしようと心がけている。 がまだまだ初心者。[ドキュメントを見ながらの作業](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E9%AB%98%E5%BA%A6%E3%81%AA%E3%83%9E%E3%83%BC%E3%82%B8%E6%89%8B%E6%B3%95#r_advanced_merging)になるので、心の中ではコンフリクトは起きないでくれと願っている。 基本的にmaster側でどうにかするのではなくて、develop側でコンフリクトを解消する方針を立てている。 今回もそれに従って、masterにある変更点をdevelopにマージすることでコンフリクトを解消し、それをmasterにマージする流れになる。 なんだか二度手間ではあるが、OSS的にはそっちのほうがいいとかないとか ただ、今回は何も考えなくマージするとdevelop側のファイルが消えてしまう状態になってしまった。
うわー出たよ、Git使っていて困るパターンだ…
## git merge -Xours \
ドキュメントにはコンフリクトがある場合どちらか一方の変更を取り込むよう指定できるオプションについて書かれていたので、まずそちらを試してみた。 ```bash git checkout develop # コンフリクトがあったらdevelopの方を採用する git merge -Xours master # こっちだとmasterの変更点が採用される git merge -Xtheirs master ``` が、ダメ。 そもそもコンフリクトが起きていなかったので、これではダメである。 ## git merge -s ours \
ドキュメントのその次の説明ではGitを騙して何もマージしていいないのにマージしたことにするオプションを紹介していたのでそちらを試してみた。 ちょうど、master/developブランチで開発をしている想定での説明だったのでこれはいいのではないかと期待を抱いてタイピングする。 ```bash git checkout develop #マージをしたつもりマージ developの内容そのままで保持される git merge -s ours master ```
やったぜ!
ミスした原因お前じゃないかとは思うが、Gitを使っていたときに問題に直面して解決したときは心の中ではこんな感じで一喜一憂な起伏が生じてしまう。 やったぜ! 上のコマンドはもともとdevelopブランチにバグ修正用のブランチをマージしたときに上のコマンドでmasterにもバグ修正用ブランチをマージすることで、 将来developをmasterにマージしたときにコンフリクトが発生させないために使うものだそうだ。 いつでも使えるコマンドではないが、今回のケースではちょうどいい動作であったので採用し問題を解決できた。 解決できてよかった!
(画像は以下のものを使用させていただきました。)
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿