gitコマンド ~コミットの取り消し~

    • このページをはてなブックマークに追加

    公開日:2017年02月22日 最終更新日:2019年09月26日

    「Git」のコミット履歴を取り消す方法について解説します。コミット前の「git add」コマンドを取り消す方法については「git addの取り消し方法」をご覧下さい。また、「Git」の基本用語などをまだ把握していないという方は「Git の使い方 ~リポジトリへ変更内容を記録する方法~」や「Git の使い方 ~リポジトリの作成とコミット~」で説明していますのでご参考下さい。

    最終更新日:2018年4月27日

    関連記事:WindowsにGitをインストールする方法
    関連記事:GitHub 入門 ~アカウントを作成する方法~

    目次

    1. ステージング・エリアのファイルをコミットする方法

    まずは、ステージング・エリアのファイルを「コミット」する方法についておさらいをしましょう。「コミット」について既に理解しているという方は読み飛ばして構いません。
    作業ディレクトリーの「Git-ws」フォルダー内には、コミット済の二つのファイルがある状態です。このフォルダに新規ファイルを追加して、変更履歴を「コミット」します。

    ●「Git-ws」フォルダー

    git-commit1

    まずは、現在のコミット状況を確認してみましょう。

    フォルダー内にカーソルを合わせて[右クリック]→[Git Bash Here]を選択して「Git Bash」を起動します。

    「Git Bash」のコマンドプロンプトに以下のコマンドを入力して「Enter」キーを押して下さい。

    $git log

    $ git log
    commit 900672ea676da0d91ea6292170d71c79c3eb62b7
    Author: Taro Yamada
    Date: Thu Feb 23 00:00:01 2017 +0900

    First Commit MSG

    二つのファイルの変更履歴がコミットされた状態です。「Git-ws」フォルダーに新規ファイル「git-sample3.txt」を追加します。ファイルを追加したら「git add」コマンドでファイルをステージング・エリアに追加します。

    $git add git-sample3.txt

    ステージング・エリアに追加した「git-sample3.txt」ファイルを「git commit」コマンドでコミットしましょう。

    $git commit -m "Second Commit MSG"

    $ git commit -m "Second Commit MSG"
    [master d50a77a] Second Commit MSG
    1 file changed, 8 insertions(+)
    create mode 100644 git-sample3.txt

    再度ログを確認してみましょう。

    ●[git log]

    $ git log
    commit d50a77aafbfa043df1e84f9c1c7d502128cbda08
    Author: Taro Yamada
    Date: Thu Feb 23 00:02:38 2017 +0900

    Second Commit MSG

    commit 900672ea676da0d91ea6292170d71c79c3eb62b7
    Author: Taro Yamada
    Date: Thu Feb 23 00:00:01 2017 +0900

    First Commit MSG

    2回目のコミットが追加されました。

    ▲ページトップへ戻る

    2. 直前の「コミット」を取り消す【git reset --soft HEAD^】

    2回目のコミットでは、新規のファイル「git-sample3.txt」を追加してコミットしましたが、このファイルにもう少し変更を加えてからコミットをしたかったとします。方法はいくつかありますが、直近のコミットを取り消す「git reset」コマンドを使った方法を確認してみましょう。

    「Git Bash」のコマンドプロンプトに

    $git reset --soft HEAD^

    と入力して下さい。オプションの「--soft」は作業ディレクトリに加えた変更はそのままでコミットのみ取り消すオプションです。「HEAD^」は直前のコミットを表します。

    「git status」コマンドで確認してみると、2回目のコミット前の状態まで戻っていることが確認できます。

    ●[git status]

    $ git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)

    new file: git-sample3.txt

    ログも確認してみましょう。2回目のコミットが取り消されています。

    ●[git log]

    $ git log
    commit 900672ea676da0d91ea6292170d71c79c3eb62b7
    Author: Taro Yamada
    Date: Thu Feb 23 00:00:01 2017 +0900

    First Commit MSG

    ▲ページトップへ戻る

    3. 直前の「コミット」と作業ディレクトリの変更を取り消す【git reset --hard HEAD^】

    コミットだけでなく、作業ディレクトリに加えた変更も一緒に取り消しをすることも可能です。「git reset」コマンドのオプションを「--hard」にすると、コマンドの実行と一緒に先ほど追加した「git-sample3.txt」ファイルも削除されます。

    $git reset --hard HEAD^

    $ git reset --hard HEAD^
    HEAD is now at 900672e First Commit MSG

    最新のコミット(HEAD)情報がコマンドの下に表示されます。「git status」でコミット状況を確認してみると、「コミットするファイル情報はない」というメッセージが表示されます。

    ●[git status]

    $ git status
    On branch master
    nothing to commit, working tree clean

    作業ディレクトリの「Git-ws」フォルダーを確認してみましょう。

    ●「Git-ws」フォルダー

    git-commit1

    2回目のコミットで追加した「git-sample3.txt」が削除され、フォルダー内には一番最初のファイルが二つだけ残った状態になりました。

    ▲ページトップへ戻る

    4. 直前の「コミット」をやり直す【git commit --amend】

    [git commit]でファイルをコミットした後にファイルの修正を加えた場合、次のコミットではなく直前のコミットとして管理したいこともあると思います。そのような場合は、「git commit --amend」コマンドを使ってコミットのやり直しをすることが可能です。
    「Git-ws」フォルダー内には、コミット済みの二つのファイル、「git-sample1.txt」と「git-sample2.txt」があります。「git-sample1.txt」ファイルを修正してみましょう。コミット後にファイル修正した後の状態を確認します。「git status」コマンドを叩いてみると、修正した「git-sample1.txt」ファイルのステイタスが「modified」になり変更された状態のファイルが「作業ディレクトリ」にあることが分かります。

    ●[git status]

    $ git status
    On branch master
    Changes not staged for commit:
    (use "git add ..." to update what will be committed)
    (use "git checkout -- ..." to discard changes in working directory)

    modified: git-sample1.txt

    no changes added to commit (use "git add" and/or "git commit -a")

    修正ファイルをステージング・エリアに追加します。「git add」コマンドを入力して再度「git status」を確認してみましょう。

    $git add git-sample2.txt

    「git-sample2.txt」ファイルがステージング・エリアに追加されました。

    ●[git status]

    $ git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)

    modified: git-sample2.txt

    ステージング・エリアに追加された情報は、2回目のコミットとして登録することもできますが、直前のコミットに加えたい場合は、「コミットのやり直し」をすることで、直前のコミットの追加情報として登録し直すことが可能です。「git commit --amend」コマンドは直近のコミットに現在のステージング・エリアに追加された情報を追加するコマンドです。「コミットのやり直し」の前に今のコミットのログを確認してみましょう。

    ●[git status]

    $ git log
    commit aa6c8a85c606548941d1774de87b841184863e68
    Author: Taro Yamada
    Date: Thu Feb 23 00:00:07 2017 +0900

    First Commit MSG

    初回のコミットが登録されています。この状態でコミットのやり直し(git commit --amend)を実行します。

    $git commit --amend -m "First Commit Message"

    ●[git commit --amend]

    $ git commit --amend -m "First Commit Message"
    [master f818ebe] First Commit Message
    Date: Thu Feb 23 00:00:07 2017 +0900
    2 files changed, 21 insertions(+)
    create mode 100644 git-sample1.txt
    create mode 100644 git-sample2.txt

    ファイル二つと修正分が初回のコミットに登録されました。ログをもう一度確認します。

    ●[git log]

    $ git log
    commit f818ebe6550ba8e1f6da8df24b9b2f484bc03771
    Author: Taro Yamada
    Date: Thu Feb 23 00:00:07 2017 +0900

    First Commit Message

    ログに表示されるメッセージも変更しましたので、初回のコミットのログ表示にもきちんと反映されています。またコミットのやり直しですが、「commit ID」は変更されます。

    ▲ページトップへ戻る

    5. 初回の「コミット」を取り消す【git update-ref -d HEAD】

    初回のコミットを取り消すには「git update-ref」を使います。前の章で作成したコミットを使いましょう。初回コミットには、二つのファイル(git-sample1.txt と git-sample2.txt)が登録されている状態です。

    $git update-ref -d HEAD

    ●[git status]

    $ git status
    On branch master

    Initial commit

    Changes to be committed:
    (use "git rm --cached ..." to unstage)

    new file: git-sample1.txt
    new file: git-sample2.txt

    初回コミットが取り消されて、作業ディレクトリ内のファイルがステージング・エリアに登録されている状態まで戻すことができました。

    関連文書: WindowsにGitをインストールする方法
    関連文書: Git for Windows の使い方 ~準備編~
    関連文書: Git の使い方 ~リポジトリの作成とコミット~
    関連文書: Git の使い方 ~リポジトリへ変更内容を記録する方法~
    関連文書: git add の取り消し方法
    関連文書: Gitでブランチを作成する方法

    月額単価70万円〜90万円
    勤務地 東京都 渋谷区
    • このページをはてなブックマークに追加

    おすすめ記事

  • ピックアップ

    フリーランス

    【GO】サーバーサイドエンジニア★アスリート応援プラットフォーム開発/フルリモート可

    ・アスリート応援プラットフォームWebサービスのサーバサイド新規開発 ・SPA(Single Page Application...

    正社員

    【PHP/Python】Web開発エンジニア|オンラインゲームの開発とサーバー運用★残業少

    年収 :300万円〜600万円

    ◆業務系システムの受託開発(一部現場常駐による開発) ◆PCやスマートフォン向けのオンラインゲーム開...

    株式会社シンクロジック

    フリーランス

    【Node.js】バックエンドエンジニア★アドテクノロジー関連企業向け新規開発

    月額単価 :70万円〜90万円

    今後日本でもトレンドになると言われている「Header Bidding」をはじめ アドテクノロジー関連の自社サ...

    正社員

    【リーダーポジション】国内最大級 宅配ポータルサイトの開発

    ・自社サービス(出前館)のサービスサイトおよび基幹システムの開発業務 - テックリード - 開発案件...

    夢の街創造委員会株式会社