✍️ Git Main ブランチ リセット
Gitで開発していると、ついmainブランチで作業を進めてしまい、「やっぱり別ブランチに移してmainは初期状態に戻したい!」という場面によく遭遇します。
この記事では、作業中のコミットを別ブランチに退避しつつ、mainブランチをリポジトリの最初のコミット状態に戻す手順を、かたくなりすぎずにサクッと解説します。
1. いまのmainを別ブランチに避難する
1-1. 避難用ブランチを作成する
まずは、今mainに積んでしまったコミットを丸ごとコピーして、新しいブランチに退避させましょう。後でまたこのブランチに戻って作業を続けられるので安心です。
# mainブランチにいる状態で、新しいブランチを作成
git checkout -b feature/backup-main
-
feature/backup-main
は例なので、好きな名前に変えてください。 - ここから先の作業はすべて
feature/backup-main
に残ります。
2. mainブランチを最初のコミットまでリセットする
2-1. mainに戻る
まずはmainブランチに切り替えます。
git checkout main
2-2. 初回コミットのハッシュを調べる
Gitでは「親を持たないコミット」が最初のコミットです。以下のコマンドでそのハッシュを取得できます。
git rev-list --max-parents=0 HEAD
実行すると、長い16進数の文字列(例: 3f1a9b7c2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f8g
)が表示されます。これが最初のコミットです。
ポイント: リポジトリを複数人で触っていたり、過去に何度もmainにpushしていると、初回コミットがどれか迷うかもしれません。もし複数行出てきたら、日付やコミットメッセージを見ながら狙っているコミットを選んでください。
2-3. mainをハードリセットする
調べたハッシュを使って、mainを最初のコミット状態に戻します。
git reset --hard <初回コミットのハッシュ>
例:
# 例としてハッシュが3f1a9b7c2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f8gの場合
git reset --hard 3f1a9b7c2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f8g
-
--hard
オプションをつけると、インデックスや作業ツリー(ファイル)もすべてそのコミットと同じ状態に戻ります。 - この状態で
git log
を確認すると、最初のコミットだけが残っているはずです。
2-4. (必要なら)リモートのmainも上書きする
もしリモートのmainをすでに更新していて、そちらも初回コミットに戻したい場合は、強制プッシュを行います。
git push -f origin main
注意: 強制プッシュをするとリモートの履歴が上書きされるので、チームで共有している場合は必ず事前に連絡しておきましょう。ほかのメンバーがmainをベースに作業していると、履歴がなくなって大混乱になる恐れがあります。
まとめ
-
別ブランチに作業を退避する
git checkout -b feature/backup-main
→ mainの履歴をまるごと新しいブランチにコピー。ここに作業履歴が残る。
-
mainに戻って初回コミットのハッシュを調べる
git checkout main git rev-list --max-parents=0 HEAD
-
調べたハッシュでmainをハードリセット
git reset --hard <初回コミットのハッシュ>
→ これでmainは最初の状態に。
-
(必要なら)リモートに強制プッシュ
git push -f origin main
→ リモートも同じ状態に戻す。チームで共有している場合は要注意。
以上の手順で、
- 今までの作業は
feature/backup-main
に残り、 - mainブランチは最初のコミットだけが残るすっきり状態になります。
「mainを初期化したいけれど作業を残しておきたい」ケースにピッタリなので、ぜひ覚えておいてください。
この記事が、みなさんのGitライフをちょっとだけラクにできれば嬉しいです。
Let's happy coding!
Discussion