ファイルを追加し忘れた場合

目次
ファイルを追加し忘れた場合
ファイルを追加し忘れた場合
@ creator • Click to Play Video Inline
🎵 ファイルを追加し忘れた場合
Gitコミット取り消し決定版!push前後の安全なリカバリー手順

開発の現場で誤った変更を含めたままコミットしてしまったり、不要なデバッグコードを残してリポジトリに記録してしまったりした経験は、誰しも一度はあるはずです。画面の前で冷や汗をかく瞬間ですが、Gitの内部構造と適切なコマンドを把握していれば、どのような状態からでも安全にリカバリーできます。

コミットの取り消しにおいて何よりも重要なのは、「そのコミットをすでにリモートリポジトリへpushしてしまったかどうか」という判断です。この分岐を誤ると、自分だけでなくチーム全体の作業ブランチを混乱に陥れるリスクが生じます。作業中の変更を無駄にせず、安全かつスマートにコミットを取り消すための実践的な手順を詳しく整理しました。

📌 【この記事の重要ポイントまとめ】
  • 要点1:リモート共有前のローカル変更ならgit reset、push後なら履歴を残すgit revertの選択が鉄則。
  • 要点2:書いたコードを残したままコミットだけを取り消す際はgit reset --soft HEAD^が最も安全。
  • 要点3:誤って--hardでコードを消失させた場合でも、git reflogを使えば過去の状態へ巻き戻して復元可能。

【分岐点】push前とpush後で全く異なる!コミット取り消しの基本原則

Gitのコミットを取り消す際、最初に確認すべきなのは「そのコミットが自分のPCローカルだけに存在するか、すでにGitHubなどのリモートへ送信済みか」という一点に尽きます。この状況の違いによって、採用すべきアプローチは正反対になります。

まだリモートへpushしていないpush前のコミットであれば、ローカルリポジトリの歴史を自由に書き換えても誰にも迷惑はかかりません。コミットそのものを綺麗さっぱり消去したり、直前のコミットメッセージを書き直したりする柔軟な操作が可能です。

一方、すでにチームメンバーが参照できるpush後のコミットを取り消す場合、ローカルと同じ感覚で履歴を書き換えてはいけません。他人の作業環境と整合性が崩れ、コンフリクトの嵐を引き起こす原因になります。公開済みのコミットに対しては「変更を打ち消す新しいコミットを追加する」という安全な作法を守る必要があります。

【push前の対処法】直前のコミットを取り消す3つの「git reset」オプション

ローカル環境で直前のコミットを取り消したい場合、最も頼りになるのがgit reset HEAD^コマンドです。末尾のHEAD^は「現在のブランチの直前のコミット」を指します。このコマンドには主に3つのオプションが存在し、作業ツリー(実際のファイル)やステージングエリアの状態をどう扱うかによって挙動が大きく異なります。

開発現場で最も頻繁に使われるのがgit 変更を残してコミット取り消しを実現する--softオプションです。

git reset --soft HEAD^

このコマンドを実行すると、コミットの記録だけが消滅し、ファイルに加えた変更内容はステージングされた状態(git addされた状態)でそのまま作業環境に残ります。「コミットメッセージを大幅に書き直したい」「コミットに含めるファイルをいくつか追加したい」というシチュエーションに最適なコマンドです。

一方、オプションを指定しないデフォルトの--mixed(またはgit reset HEAD^単体)を実行すると、コミットが取り消された上で、変更内容はステージング前の状態(作業ツリーのみに変更が残る状態)に戻ります。

最も取り扱いに注意が必要なのが--hardオプションです。

git reset --hard HEAD^

--hardを指定すると、コミット履歴だけでなく、作業ツリー内で書いた未コミットのコードまで完全に破棄されます。「完全に不要な実験コードだったので、直前のコミットごと跡形もなく消し去りたい」という明確な意図がある場合を除き、軽率に実行するのは避けるのが賢明です。

ちょっとしたタイポならこれ!「git commit --amend」によるメッセージ修正

「コミット自体を取り消したいわけではなく、コミットメッセージの誤字を直したいだけ」「ファイルを1点だけコミットに含め忘れた」というケースでは、わざわざリセットをかける必要はありません。専用の修正コマンドであるgit commit --amendを活用するのが効率的です。

# コミットメッセージだけを修正したい場合 git commit --amend -m "正しいコミットメッセージ" git add 忘れ物ファイル.txt git commit --amend --no-edit

--amendを実行すると、直前のコミットを破棄した上で、新しい内容でコミットを作り直してくれます。コミットハッシュ自体は新しく付け替えられますが、履歴が余計に増えることなくスマートに修正を完結させることができます。

【push後の対処法】チーム開発を壊さない「git revert」コマンドの実践

リモートリポジトリへpushした後にバグが発覚し、変更を取り消したくなった場合は、履歴を過去へ巻き戻すのではなく、変更を打ち消す新しいコミットを作成するgit revertコマンドを使用します。

# 直前のコミットを打ち消す場合 git revert HEAD # 特定のコミットIDの変更を打ち消す場合 git revert [対象のコミットハッシュ]

git revertを実行すると、対象のコミットで行われた「コードの追加」を「削除」へ、「コードの削除」を「追加」へと自動で反転させた逆パッチのコミットが新たに作成されます。

履歴を一切削除・改ざんしないため、リモートリポジトリにそのまま安全にpushできます。チームメンバーの環境でコミットの不整合が起きることもなく、プロジェクトの変更履歴に「いつ、どのような理由で取り消しが行われたのか」という文脈を綺麗に残せる点が大きなメリットです。

絶対NG?「git push --force」のリスクと安全なコミット履歴の管理

リモートにpushしてしまった後でも、ローカルでgit resetを実行した後にgit push --force(強制プッシュ)を実行すれば、リモート上のコミット履歴を物理的に削除することは可能です。しかし、これは共同開発において極めて危険な操作にあたります。

あなたが強制プッシュでコミットを消し去った瞬間、同じブランチをプルして作業していた他のエンジニアの手元では、リポジトリの履歴の枝分かれ(不整合)が発生します。最悪の場合、同僚がプッシュした最新コードを意図せず上書きして吹き飛ばしてしまう重大なインシデントに直結します。

個人で開発している専用ブランチや、プルリクエスト作成前の自分しか触っていないフィーチャーブランチであれば許容されるケースもありますが、mainやdevelopなどの共通ブランチにおける強制プッシュは厳禁です。強制プッシュが必要な場面でも、他人のコミットを誤って上書きしない安全機構が備わったgit push --force-with-leaseを使う習慣を身につけておくのが望ましい選択です。

「間違えて消してしまった!」絶望から救い出す「git reflog」復元術

git reset --hardを誤って実行してしまい、必要なコードまで消えてしまったとしても、諦める必要はありません。Gitはローカルリポジトリ上で行われたブランチの移動やコミットの操作履歴を一定期間すべて記録しており、その履歴を参照できるのがgit reflogコマンドです。

git reflog

このコマンドを叩くと、以下のように過去のアクション履歴とHEAD@{数字}という参照ポインタが一覧表示されます。

a1b2c3d HEAD@{0}: reset: moving to HEAD^ e4f5g6h HEAD@{1}: commit: 間違えて消した大切なコードのコミット 7i8j9k0 HEAD@{2}: commit: その前のコミット

消去してしまったコミットのポイント(上記例ではHEAD@{1})を確認したら、その地点に向けて再度リセットをかけます。

git reset --hard HEAD@{1}

これだけで、ハードリセットによって消え去ったはずのコミットと作業ツリーのコードが、何事もなかったかのように完璧に元の状態へと復元されます。この復元ルートを知っておくだけで、日々の開発作業における精神的な余裕は劇的に変わるはずです。

【git commit 取り消し】に関するよくある質問(FAQ)

Q1:コミットを取り消した際、書いたプログラムコードが消えてしまうのが一番怖いのですが?
A1:コードを残したい場合は、必ずgit reset --soft HEAD^を使用してください。このコマンドであれば、作業ファイルはもちろん、git addされた状態も維持されたままコミットだけが安全に解除されます。万が一--hardを使ってコードを消してしまった場合でも、直後であればgit reflogから元のコミットハッシュを探して復元が可能です。

Q2:直前ではなく、2つ以上前のコミットを取り消すにはどうすればよいですか?
A2:push前であれば、git reset HEAD~2(2つ前)のようにチルダを使って巻き戻すか、git rebase -i HEAD~3を使ってインタラクティブに対象のコミットをdrop(削除)またはedit(修正)します。push後のコミットであれば、git revert [打ち消したいコミットのハッシュ]を実行してください。

Q3:ステージング(git add)だけを取り消して、コミット前に戻す方法は?
A3:コミットを実行する前であれば、git restore --staged [ファイル名]を実行することで、ファイルの変更内容を保持したままステージング状態のみを解除できます。全ファイルを一括で戻したい場合はgit restore --staged .を実行します。

まとめ:状況に応じたコマンド選択で安全なGit運用を

Gitにおけるコミット取り消しは、仕組みを正しく理解していれば決して恐ろしい操作ではありません。判断の基準は非常にシンプルです。

ローカル作業中(push前)のミスであれば、変更を残せるgit reset --soft HEAD^やメッセージを上書きするgit commit --amendを活用してスマートに修正します。すでに共有サーバーへ反映済み(push後)であれば、履歴を改変せず安全に変更を打ち消すgit revertを選択するのがプロの開発者としての標準ルールです。

コマンドそれぞれの役割と影響範囲を把握し、作業状況に応じた的確なリカバリーを選択して、日々のスムーズな開発ワークフローを維持していきましょう。 (出典: git commit 取り消し(Yahoo!ニュース))

git commit 取り消し
git commit 取り消し
git commit 取り消し