【git】masterブランチから切ったブランチを再度masterブランチにマージをしようとしたときのメモ
解決できなかった、個人的なメモ
手作業でできる範囲だったので手作業で作業をした
経緯
クライアントからの修正を日にちを空けて2回に渡って反映する必要性があった
なので、「release/firstTime」と「release/secondTime」みたいにmasterブランチから切って僕以外の人でも対応が可能な状態にして置いておいた
最初の反映を行う日が来たので「release/firstTime」をmasterブランチにマージした
# ↓masterブランチに移動
$ git checkout master
# ↓ release/firstTimeブランチをmasterブランチにマージ
$ git merge release/firstTime
これは特に問題なく上手くいった
2回目の反映の時、上記と同じような手順を取ったが
$ git merge release/secondTime
Already up to date.
と「アップデート済み」と表示されるが変更が反映されない
「release/secondTime」ブランチに何か問題があると思いcheckoutコマンドを使いブランチを切り替え時に以下の表示が出た
$ git checkout release/secondTime
Switched to branch 'release/secondTime'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
その後、色々やってみたが解決できず上記コマンドにあるように、git pull
を「release/secondTime」を叩いてみた
$ git pull
Updating b049145..96b1684
Fast-forward
projects/assets/test/css/style.css | 10672 +++++++++++++++++++-
projects/components/footer.hbs | 12 +-
resources/src/scss/components/footer.scss | 3 +-
4 files changed, 10680 insertions(+), 9 deletions(-)
確認するとmasterブランチの内容に書き変わり、masterブランチに反映したい内容が消されてしまった
リモートリポジトリにアップロードしているので以下のコマンドで元に戻した
※以下のコマンドは強制的にリモートリポジトリに内容を合わせるコマンド
git fetch origin release/secondTime
git reset --hard origin/release/secondTime
その後よくわからず手作業で直した
原因と解決方法
色々調べていたのだが、masterブランチから「release/firstTime」と「release/secondTime」を切り離し、masterブランチに「release/firstTime」の内容をマージしたタイミングでmasterブランチと「release/secondTime」ブランチが同じ物ではない別のブランチになってしまったことが原因なのだと思う
というのも、「release/secondTime」ブランチに切り替えた際のメッセージ
Switched to branch 'release/secondTime'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
上記について調べると、masterブランチは2コミット分「release/secondTime」より先に行っているから「git pull」コマンドを叩いてmasterブランチと同じ状態にできるよって意味みたいで
「release/secondTime」はmasterブランチにマージするには古いってことみたい
だから、「git pull」を叩くとmasterブランチと同じ状態になって、古い状態の「release/secondTime」の内容が消えたというのも理解ができる
で、この場合で「release/secondTime」の内容はmasterブランチに反映を行いたいブランチで消えては困る、という時にgit stash
一時的にその内容を退避させることが可能みたい
参考:https://dev.classmethod.jp/articles/git-pull-local-change-keep/
退避させることで、「git pull」を行ってもmasterブランチに上書きしたい内容を保持することができる
これが、解決方法の1つ
もう一つが、「rebase」をすることで強制的にmasterブランチに上書きをする
というのも、今回の問題がmasterブランチから「release/secondTime」ブランチを切った後にmasterブランチを更新してしまったことで、rebaseをすることで「release/secondTime」がmasterブランチより先のブランチ、言い換えるならmasterブランチから「release/secondTime」と同じ状態にすることができるみたい
詳しくは参考サイトがわかりやすかった
参考:https://qiita.com/vsanna/items/451b42f886c599a16a55
やり方は「release/secondTime」ブランチに移動して
git rebase master
以下のようになっていた状態が、
A--B--C------F--G (master)
\
D--E (release/secondTime)
rebaseすることで、以下のようになるみたい
A--B--C------F--G (master)
\
D'--E' (release/secondTime)
ただ、rebaseする前のD, EのコミットIDなどが無くなるというデメリットが発生するようだが、rebase後のD、EのコミットIDがあれば問題ない
というか、残して使うこともあまりない気がするので無視
この状態にしてマージできるのかはわからないが、今度同じようなことが起きた時に試して見ようと思う
ちなみに、「fast-forwardマージ」というのが普段使っているマージで「release/firstTime」ブランチが問題なくマージできたのは以下のような状態だったからみたい
A--B--C (master)
\
D--E (release/firstTime)
まとめると
masterブランチからブランチを切ったタイミング以降にmasterブランチを更新しちゃうと切ったブランチと整合性が取れなくなっちゃってマージが上手く行かなくなるよう
なので、切ったブランチをまずはそのmasterブランチと整合性を取る必要性がある
その際に、「git stash」で一時的に避難させるか、「rebase」をすることで解決できる可能性があるよう