いつもgitコマンドを忘れてしまうので、備忘録を残しました。
やらかしてしまったときの対象方法をまとめました。
多人数で開発している場合、以下で記載しているコマンドを実行すると大変なことになります。やらかさないようにコミット前によくチェックをしましょう(自戒)
どうしても使用する場合は自己責任でお願いします。
もし間違っていたらごめんなさい。ご指摘してくれると助かります。
※コマンドの見方
{ }:必須の入力項目
[ ]:任意の入力項目
|:選択項目
目次
gitの大まかな流れ
gitは分散型バージョン管理システムであり、サーバ以外にもローカルPCにもデータベースがあるイメージです。
gitの大まかな構成として、以下の4フェーズがあります。
- ワーキングディレクトリ(ワーキングツリー)
- コンテンツ(ファイルやフォルダなど)の変更/削除/新規追加などの作業をするためのエリア
- インデックス(ステージングエリア)
- ワーキングディレクトリで変更/削除/新規追加したコンテンツをローカルリポジトリに保存したい時に、対象コンテンツを保持しておくエリア
- ここにあるコンテンツを直接変更することは基本やらない
- ローカルリポジトリ
- 自分の作業エリアにあるデータベース
- みんなに見えないローカルな環境で、コンテンツの変更履歴を管理することができる
- リモートリポジトリ
- みんなの作業エリアにあるデータベース
- 他の人に見てもらったり、みんなでコンテンツの変更履歴を管理することができる
上記のフェーズの間はコマンドによってやりとりします。
ワーキングディレクトリ内の変更をなかったことにする(git add実行前)
// 特定のファイルの変更を取り消す
git checkout {ファイル名}
// 特定のディレクトリ以下の変更を再起的に取り消す
git checkout {ディレクトリ名}
// 全てを元に戻す
git checkout .
git checkout {ファイル名}
// 特定のディレクトリ以下の変更を再起的に取り消す
git checkout {ディレクトリ名}
// 全てを元に戻す
git checkout .
ステージングエリアにある変更をなかったことにする(git add実行後、git commit実行前)
// 特定のファイルの変更を取り消す
git reset HEAD {ファイル名}
// 全てを元に戻す
git reset HEAD
git reset HEAD {ファイル名}
// 全てを元に戻す
git reset HEAD
ローカルリポジトリにある変更をなかったことにする(git commit実行後、git push実行前)
やりかたは大きく3パターンある。
コミットをなかったことにする(履歴も残らない)
// コミットをなかったことにする(履歴も残らない)
git reset [--hard | --soft] [HEAD^ | HEAD~{n} | {コミットハッシュ値}]
git reset [--hard | --soft] [HEAD^ | HEAD~{n} | {コミットハッシュ値}]
- [--hard]:コミット取り消した上でワーキングディレクトリの内容も書き換えたい場合に使用
- [--soft]:ワーキングディレクトリの内容はそのままでコミットだけを取り消したい場合に使用
- [HEAD^]:直前のコミット
- 3個前なら[HEAD^^^]でOK
- [HEAD~{n}]:nコ前のコミット
- 3個前なら[HEAD~3]でOK
コミットを打ち消す(履歴は残る)
// コミットを打ち消す(履歴は残る)
git revert {コミットのハッシュ値}
git revert {コミットのハッシュ値}
コミットを上書きする
// コミットを上書きする
git commit --amend
git commit --amend
- コミットし忘れたファイルを既存コミットに上書きすることもできる
- 実行するとエディタが開いてコミットメッセージの変更ができる
リモートリポジトリにある変更をなかったことにする(git push実行後)
※以下のコマンドは実行に注意。自己責任で実行してください。
2パターンのやりかたがある。
git resetでリモートリポジトリにある変更をなかったことにする
// git resetでリモートリポジトリにある変更をなかったことにする
git reset --hard [ HEAD^ | HEAD~{n} | {コミットハッシュ値}]
// 強制的にリモートリポジトリを更新
git push -f origin {ブランチ名}
git reset --hard [ HEAD^ | HEAD~{n} | {コミットハッシュ値}]
// 強制的にリモートリポジトリを更新
git push -f origin {ブランチ名}
- [HEAD^]:直前のコミット
- 3個前なら[HEAD^^^]でOK
- [HEAD~{n}]:nコ前のコミット
- 3個前なら[HEAD~3]でOK
- 「git push」すると、コンフリクトが発生するので、強制的にコミットするように-fコマンドで指示
git rebaseでリモートリポジトリにある変更をなかったことにする
// git resetでリモートリポジトリにある変更をなかったことにする
git rebase -i {取り消したいコミットの直前のコミットのハッシュ値}
// 強制的にリモートリポジトリを更新
git push -f origin {ブランチ名}
git rebase -i {取り消したいコミットの直前のコミットのハッシュ値}
// 強制的にリモートリポジトリを更新
git push -f origin {ブランチ名}
- エディタが起動するので、pick~のところをdrop~に修正する
- [pick ハッシュ値 commit comment 1]→[drop ハッシュ値 commit comment 1]で保存して終了すると、コミットが削除されます。
- 「git push」すると、コンフリクトが発生するので、強制的にコミットするように-fコマンドで指示
- ただし、「git reflog」では履歴が残っているようなので、厳密には完全には消し切れていないらしい。
関連情報
参考
- GitHubでやらかしたコミット履歴を(ほぼ)見えなくする方法 | りんごとバナナとエンジニア
- 「git rebase」のやり方がまとめられている
- Gitでやらかした時に使える19個の奥義 | Qiita
- やらかしたときの一通りの対処法がまとめられている
- git commit を取り消して元に戻す方法、徹底まとめ | www-creators
- コミット時のインデックスと作業ツリーのイメージがわかりやすい
以上!
コメント