備忘録。
何がしたかったか
- 他人のgithubのprojectをgitlabにクローンしてきて社内公開を前提に開発を進めていた。
- 後日、githubにも公開したくなった。
- gitlab公開前提に作っていたので社外の人には見せたくない変更をしていたコミットが多々あった
- それらの変更を打ち消すようなコミットを作っても、このままpushすると過去の見せたくない変更が含まれたコミットも結局一緒に公開されてしまう。それは避けたい。(途中の変更はなかったことにしたい。)
- また、localには社外公開したくないコミットも残しておきたかった。
- さらに、クローン元のprojectがgithubにクローンしたときにはgitlabにクローンしてきた時より開発が進んでいて、githubにクローンしてきたものにはどっちみちそのまますんなりlocalの変更をpushできないことが判明した。
解決法
ざっくりな流れ
localのmasterの先頭に新しいブランチ作成
→新しいブランチでは、squashで見せたくないコミットは全部まとめてしまう
→新しいブランチをremote(github)のmaster(元projectのクローンしただけ)にリベース(&コンフリクトの解決)&push
詳しく
元の状態。過去に行った社外の人に見せたくない変更を含んだコミットが過去にたくさん。社外の人に見せられるのは最新状態のみ。加えて、remote(github)のmaster(元projectのクローンしただけの状態)とlocalのmasterがそもそもこのままpushしたら競合するようになってしまっている。
新しいブランチをremote(github)のmasterにリベース。競合が発生するのでその解決をして、push。
- こうすることによって
- 社外の人に見せたくない過去の変更は一切外に出ない(なかったことになる)
- localには社外に見せたくない変更を含めて過去のすべての変更を残しておくことができる
を両方実現できた。