Githubにgitリポジトリをリモートで送って、リポジトリをシェアしたはいいけど、何らかの事情、例えばreadme.md、リードミーファイルにタイプミスがあってちょこっと変更しただけ、とか、何か見られたくない編集履歴をコミットしてしまって、とりあえず今の状態のリポジトリを”最初のコミット”としてGithubリモートにpushしたい、といったようなケースが、あるかもしれません。
そんなときに使える手段を紹介します。
“git checkout”の”orphan”オプションを使用します。
“orphan”オプションでは、過去のコミットのなにもない状態の、gitが初期化されたような状態としてのブランチを仮想的に作り出し、
その仮想ブランチ上で”git commit”コミットすることでそのコミットが最初のコミットとしてそのブランチに登録されます。
ようは、過去のコミットを無視して1番目のコミットをするブランチを作るためのブランチ、というオプションです。
git checkout --orphan tmp02
orphanオプションをつけてcheckoutした場合、コマンド実行直後ではbranchにブランチは表示されません。これは仕様です。
$ git branch
main
tmp
といっても現在の実際のブランチは”tmp02″です。
“git log”をして、過去のコミットがなにもないので、コミットがないエラーとなることを確認します。
$ git log
fatal: your current branch 'tmp02' does not have any commits yet
“git status”でステーテス確認をしてみても、同様です。
もし過去のコミットがすでにあるなら、表示されるファイルは”change”のはずですが、ここでは”new file”となっています。
$ git status
On branch tmp02
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: main.user.js
new file: readme.md
コミットしてみましょう。
git add .
git commit -m .
コミットしたところで、”git branch”でブランチを改めて確認してみます。
ここではじめて、ブランチに”tmp02″が表示されるようになります。
$ git branch
main
tmp
* tmp02
さて、以下からがローカルのgitリポジトリを初期化する、という処理です。
以下のコマンド”-D”ではブランチ”main”をdelete、削除します。当然過去のコミットが消えるので気をつけてください。
git branch -D main
コミットが消えたところで、tmp02ブランチをmainブランチにコピーして移動します。
git checkout -b main
“git push”でgithubのリモートリポジトリにpushします。
リモート先のコミットが上書きされコミットが消えますのでこちらも注意してください。
git push -f origin main:main
“-f”–forceオプションをつけてpushをしないと、エラーになります。
リモートのリポジトリとローカルのリポジトリの進捗が異なる(リモートの方には過去のコミットがあるがローカルには1コミットしかない)ためです。
–forceオプションによりそれを上書きしてpushします。
$ git push -u origin main
Username for 'https://github.com': yuis-ice
Password for 'https://yuis-ice@github.com':
To https://github.com/yuis-ice/alc-plus.js.git
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/yuis-ice/alc-plus.js.git'
hint: Updates were rejected because the tip of your current branch is behind
あるいは、ブランチをmainに変更しなくても、”git push”でローカルブランチの指定を変更してやることで上手くできますね。
git push -f origin tmp02:main