gitでちょっとバタバタした話。
複数ブランチを行き来しながら
stashしたりstash popしたりを繰り返していたら、
なんかよくわからないけどコンフリクトが起きてしまいました。
複数人での開発で履歴を汚くしたくなかったので、
mergeはできるだけしたくない→コンフリクト解消もしたくない
とか色々考えた結果、rebaseで昔のコミットまで戻ることで解決はできた、、けど
その後、本来作業したかったブランチにチェックアウトしたところ
Switched to branch 'hoge'
Your branch and 'origin/hoge' have diverged,
and have 44 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
チェックアウトしただけでなんか怒られてしまった。
多分コンフリクト解消したりなんだりのタイミングで、
リモートにある同じ名前のブランチ(追跡元)と
ローカルブランチに差分が出てるからクリアにしないとプッシュできないよ、
みたいな感じですね。(すでにリモートにpush済みのブランチ)
Your branch and 'origin/hoge' have diverged,
and have 44 and 1 different commits each, respectively.
元々hogeブランチを作成した時点から、
ローカルのhogeは44進んでいてリモートのhogeは1進んでますよ
ってことですね。
リモートとの差分を確認
$ git diff origin/hoge
見てみると自分が変更した覚えのないところもいじられている。
そうか、コンフリクト解消した時に
リモートの44コミットを取り込んじゃったんだ、と理解
正しいのは、masterから1進んでいるだけのリモートのhoge。
要はローカルの内容を本来あるべき姿(リモート)の内容に
強制的にしてしまえば良いのだ!!
強制上書き
$ git reset --hard origin/hoge
* branch feature/hoge -> FETCH_HEAD
無事差分がなくなり、その後の作業ができるようになりました!!
2019/11/7追記
また同じようなことが起こりました。
今度は上と逆のパターン。
Switched to branch 'hoge'
Your branch and 'origin/hoge' have diverged,
and have 1 and 44 different commits each, respectively.
(ここで1と44がそっくりそのまま同じ数字なのは偶然w)
今回の場合は、ローカルが1コミット進んでいてリモートが44進んでいるらしい。
まあ普通は共同開発の場ではこっちのほうがきっと多いよね。。
今回の場合、一度リモートにプッシュしてプルリクを出していたものに修正を加え、再度プッシュしようとしたらこうなったのだけど
なんでリモートがいつの間にか44進んじゃったのかはよくわからず。。
とりあえず、他の人のコミットを消したりなんかということがあったら最悪なので
リモートの進んでいる44コミット分をローカルにマージすることにしました。
プルリクに関係ない履歴が入ってしまうけど、まあしゃーない。
(一応先輩にそれで大丈夫かどうか確認した)
$ git merge FETCH_HEAD
既にfetchはさっきやってるので、mergeのみする。
(pullはgit fetchと↑を一気にやっている)
そうするとvimが立ち上がる。
と思ったらなんかエラー
error: There was a problem with the editor 'vi'.
深追いはしなかったけど、ちょっと調べたらvimを立ち上げたいのに立ち上がらなかったよ、っていうことらしい
Enter押せば問題ないとのことだったので、そのままEnter押して
コミットメッセージを指定したら無事リモートが取り込まれました。
ちゃんとさっき自分がコミットしたやつも残ってて安心。解決。
参考
www.pistolfly.com
www-creators.com