Gitで誤ってCommitしてしまった・・・!
普段の業務や個人でのプログラミングの際に、「Gitで誤ってCommitしてしまった・・・!」ということは結構あります!
まだあまりGitの操作に慣れていなかったり、経験が浅いと焦ってしまいますよね。
今回はGitでのCommitに焦点を当てて、様々な状況に応じた対処方法を掲載していきたいと思います!
Git関連の難しい用語などはほとんど使わずにやりたい事に焦点を当てて書いていますので、Git入門者の方にも是非参考になればと思います!
ローカル or リモートでCommitを取り消すのか
まずGitでコミットを取り消す際に前提となる注意点を紹介しておきたいと思います!
今皆さんのコミットを取り消したい状況としては
- ローカルのみでCommitを取り消せばOKの場合
(取り消したいコミットがリモートへはPUSHされていない状態) - ローカルもリモートもCommitを取り消す必要がある場合
(取り消したいコミットが既にリモートへPUSHされてしまっている状態)
上記の内どちらでしょうか?
どちらの状況かによって基本的な対象方法が変わってきますので、注意してください!
ローカルのみでCommitを取り消せばOKの場合
対象の取り消したいコミットがリモートへPUSHされていない状態で、ローカルのみでコミットを取り消せばOKな場合は、特に何も気にせず、素直にローカルのコミットを取り消せば大丈夫です。
これから様々な状況に応じた対処方法を紹介していくので、素直にその方法に従って修正していけばOKです!
ローカルもリモートもCommitを取り消す必要がある場合
一方で、対象の取り消したいコミットが既にリモートへPUSHされてしまっている場合は、これから紹介するやり方でローカルのコミットを取り消した後に、リモートへは強制的にPUSHする必要が出てくるので、注意してください!
ただ、例えばチームで開発を行なっているような場合は、強制PUSHについては慎重に行わなければいけません!
自分で作成した「feature/something」のようなブランチであれば大抵は問題ないですが、developやmasterブランチなどのプロジェクトメンバーで共有して使用しているブランチでは、強制PUSHは基本的にはしてはいけません。
もし実行する必要がある場合は、ちゃんと担当者の方へ確認するか、強制PUSHしても問題ないような状態にしてから実施するようにしてください!
しかし状況によっては、強制PUSHで対処しないといけないことは日常でも結構起こってくる場合があります。(プロジェクトでのGit運用方法にもよりますが)
強制PUSHでリモートのコミット履歴を強制的に書き換える必要が出てきたら、これから紹介していく様々な対象方法を実施した後に、以下のコマンドを実行してください。
こちらのコマンドを実行することで、ローカルで実施した内容を強制的にリモートのブランチへ反映させることができます!
# ブランチ名の前に + をつける
$ git push origin +${ブランチ名}
# または
# -f オプションを使用する
$ git push -f origin ${ブランチ名}
基本的なコミットの打ち消し方法
resetで直前のコミットを取り消す
ここでは、git resetで直前のコミットを取り消す方法を紹介していきます!
git resetでのオプション
- –soft(–mixed or オプション無し)
- –hard
でここでの使い方が異なるため、それぞれ説明していきます!
reset –soft
git resetの–softオプションを用いて、直前のコミットまで戻し、打ち消していきます!
直前まで戻した分はステージングされて残るので、
- 全部いらない差分の場合は、全部の差分を飛ばす
- いらない差分は飛ばして、いる差分だけをコミットする
のように対応すれば、柔軟に打ち消しを行うことが可能です!
$ git reset --soft HEAD^
reset –hard
reset –hardを使うことで、直前のコミットまで取り消すことができます。
打ち消したコミットは消えてなくなってしまいますので、実行には注意が必要です!
$ git reset --hard HEAD^
resetで過去のコミットまで戻して取り消す
こちらはresetを用いて、過去の特定の地点までコミットを戻すことで、打ち消していきます!
reset –soft
reset –softを使い、過去のコミットまで戻し、打ち消します。
コミットIDを指定する事で、過去のコミットまで戻すことが出来ます。
過去のコミットまで戻した分の変更分は無くならずに残るので、後からコミット履歴を修正する時にも活用できます!
$ git reset --soft ${COMMIT_ID}
上記コマンドを実行後、
- 過去のコミットまで戻った状態になる
- 戻した分が差分として残っている状態になる
という感じになるので、まとめてコミットしたり、任意に分割してコミットすれば、後からコミット履歴を修正するという便利な使い方も可能です!
reset –hard
reset –hardを使い、過去のコミットまで戻し、打ち消します。
コミットは完全に過去の地点まで戻り、戻った部分のコミットは消えてなくなってしまうので、実行には必要です!
$ git reset --hard ${COMMIT_ID}
打ち消し履歴付きでコミットを取り消す
打ち消しコミットを生成して、コミットを取り消すことができます!
打ち消しコミットを新規で生成するため、対象の取り消したいコミットがリモートに上がっている状態でも問題ありません。(強制PUSHをする必要がない)
直前のコミットを取り消す
直前のコミットを打ち消したい時は、以下のコマンドを使用します!
$ git revert HEAD
特定のコミットを指定して取り消す
コミットIDを指定することで、特定のコミットを指定して取り消すことができます!
$ git revert ${COMMIT_ID}
直前コミットを上書きして修正する
直前のコミットを上書きすることで打ち消しを行うことができます!
コミットを上書きするので(コミットID自体も変化するので)、対象の取り消したいコミットがリモートに上がっている場合は強制PUSHをする必要が出てくるので、注意が必要です!
$ git commit --amend
過去のコミットに戻して取り消しをする
reflogをうまく活用すると簡単に過去の任意の状態にまで取り消しを行うことができます!
reflogを実行する
reflogを実行し、戻したいポイントを確認します!
$ git reflog
reset –hardで過去の状態に戻す
戻したいポイント(ここでは、HEAD@{2}に戻します)がわかれば、reset –hardで指定することで過去の状態に戻し、取り消しをすることができます!
$ git reset --hard HEAD@{2}
ファイル単位でgit commitを取り消したい場合
コミットを取り消すと言っても、「特定のファイルだけcommitを取り消したい!」という場合があります。
ここでは、特定のファイルをあるCommit地点に戻し、操作を取り消す方法を紹介していきます!
コマンド
コマンドの書式はこちらになります!
git checkoutの第一引数に戻したい地点のコミットID、第二引数にファイル名を指定します!
$ git checkout ${COMMIT_ID} ${FILE_NAME}
コマンド例
実際のコマンド例はこんな感じになります!
$ git checkout 4d8bf***1d5b****ef85******5778786 Sample.txt
変更を確定させる
特定のファイルをあるコミット地点に戻すことができて問題なければ、以下のコマンドのようにコミットをして、操作を確定させれば完了です!
$ git commit -m "Revoke commit by file"
またこの場合は新規にコミットが作成され、既存のコミットには影響を与えないため、リモートへそのままPUSHしても問題はありません。
リモートのブランチへPUSHしてしまった後にcommitを取り消す方法
Gitで誤ってPUSHしてしまった時の取り消し方法は、こちらの記事に詳しく掲載されていますので、こちらをご覧ください!
git commitの取り消しの取り消しをしたい!という時
「コミットの取り消しの取り消しをしたい!」とGitを学習中の方からたまに教えて欲しいと言われることがあります。
最初「!?」となりますが、これまでお伝えしてきた取り消しの方法で対処可能となりますので、安心してください!
コミットの取り消しを取り消す方法
コミットを取り消した打ち消しコミットを取り消したい時の方法は、上記で既に紹介済みの過去のコミットに戻す方法を使用すれば簡単に実現することができます!
上記で紹介している手順を応用して、コミットを取り消した打ち消しコミットの前の状態に戻せばOKです!
まとめ
今回は、Gitで誤ってCommitしてしまった時の様々な取り消し方法をまとめました!
Gitでの操作は最初とても難しく思いますが、慣れればかなり効率的に開発が行う事ができるので、この機会に慣れておきたいですね!
また、もしCommitの取り消し方法に迷った時のために、是非この記事をブックマークしておき、活用してください!
コメント