git でやらかした
状況としては下記のとおり。
(1) master
ブランチから develop
ブランチを切って作業をした
(2) develop
ブランチで何度か commit した
(3) 本来は git push origin develop
とすべきところを、間違えて git push origin master
としてしまった
(4) その結果、develop
ブランチの変更が、リモートの master
ブランチに反映されてしまった
この状態からリモートレポジトリを元に戻し、あらためて git push origin develop
としたい。なお、コミット履歴は下記のとおり。
33e0459 * develop origin/master いろいろと機能を追加
41925cc * 関数を追加
2e1fcea * 諸々修正
2bdc6cb * いったんすっきりさせた
6b0eac3 * master 誤記を修正
回復方法をいろいろ検索してもこれといった方法が見当たらず、思い切って質問したところ、神が降臨して丁寧に手順を教えてくださったので(ありがとうございました)、備忘を兼ねて記録に残します。
回復手順
状況に応じて下記3つの方針がある。
方針A
リモートの master
の履歴を 6b0eac3
まで巻き戻し、develop
の内容を反映させた事実を無かったことにする。
$ git checkout master
$ git push --force origin master
$ git checkout develop
$ git push origin develop
リモートからコミットを取り除くことになるので、複数人で作業していてリモートの master
を他の誰かが参照しているならやるべきではない。自分一人で作業しているなら手軽。
方針B
ローカルの master
を 33e0459
まで進めた上で、6b0eac3
以降のコミットを新しいものから順にすべて revert する。
$ git checkout master
$ git merge --ff develop
$ git revert 6b0eac3..HEAD
$ git push origin master
$ git checkout develop
$ git push origin develop
複数人で作業しているならこれが安全。1コミットずつ revert した履歴を残したいならこれ。
方針C
ローカルの master
を 33e0459
まで進めた上で、6b0eac3
時点のファイルを取り出し、それをコミットする。これも安全。1コミットで元に戻したいならこれ。
$ git checkout master
$ git merge --ff develop
$ git checkout 6b0eac3 -- .
$ git commit -a
$ git push origin master
$ git checkout develop
$ git push origin develop
git むづかしい
私は気楽な個人開発で1人作業していたので、方針Aでサクッと解決できたんですが、これがチーム開発だとそうはいかないですよね。現場で顔を青くする様子が目に浮かびます。
それにしても、git むづかしすぎない…?🫠
人類(特に私)には早すぎるツールなのかもしれない…。