作業ブランチにpushしたつもりがmainブランチにpushしちゃったって話よく聞きますよね。自分はまだしてないけど、性格上いつかやりそうだからその対処方についてここに残して、いつかの自分のためにしたい。
先に結論を話すとgit branch の癖をつけよう。
前提
- 作業ブランチに
git add,git commit,git pushするつもりが誤ってmainブランチにしてしまった。 - mainブランチをpullした人はいない
目的
- mainブランチにpushしてしまったコミット(commit)を取り消して、作業ブランチにpushしなおしたい。
1. 作業ブランチにmainブランチの作業内容を移す
mainブランチでpushしてしまった内容を作業ブランチに移して、pushしなおす。
$ git checkout 作業ブランチ #作業ブランチに切り替え
$ git merge main #mainブランチの最新commitを取り込む
$ git push origin 作業ブランチ #作業ブランチにpushしなおす
2.mainブランチを作業前に戻す
mainブランチから誤ったコミットを削除する。
#mainブランチに切り替え
$ git checkout main
#コミットハッシュを取得
#ここで取得するコミットハッシュは誤ってcommitしたものではなく、その1つ前(作業前)のコミットハッシュ
$ git log --oneline
#作業前のコミットにリセット
$ git reset --hard <作業前のコミットハッシュ>
#強制的にリモートを上書き
$ git push -f origin main
-
git pushではなくgit push -fの理由
通常のgit pushは 「リモートにある履歴より新しいもの」 しか送れない。
git reset --hardでローカルの履歴を「過去の状態」に戻すと、
ローカルの方が“古い”状態 になる。
そのため、強制的にpushする必要がある。
*前提にも書いたがあくまでmainブランチをpullした人がいないことが条件。
チーム開発等の場合は注意する。
pullしていた場合のパターンは別の機会に書くかもしれない。
まとめ
何度もいうがmainがpullされていない確信が持てない場合はこの方法はだめ!
git branchでブランチを確認する癖をつけて!!!
