メモ > 技術 > 開発: Git > コマンドで操作を取り消す
コマンドで操作を取り消す
※取り消しは「Sourcetreeでgitを操作する(応用)」の内容も参照
PULL(デプロイ)時に競合が発生した場合、list.twig の変更のみ取り消す
git diff --name-only … 差分のあるファイルを確認
git diff -- app/view/list.php … 差分の詳細を確認
git checkout HEAD -- app/view/list.php … ファイルを指定して変更を取り消し
git diff --name-only … 差分が無くなったことを確認
直前のコミットを取り消し(作業内容は残る)
git reset --soft HEAD^
直前のコミットを取り消し(作業内容も消える)
git reset --hard HEAD^
コミット後の作業をすべて取り消し
git reset --hard HEAD
指定した時点の履歴に戻る
git log
git reset --hard xxxxxxx
履歴を元の状態に戻す
git reset --hard ORIG_HEAD
デプロイ済みのファイルを現在のブランチに強制一致
git checkout .
デプロイ済みのファイルをmasterに強制一致
git fetch origin
git reset --hard origin/master
デプロイ済みのファイルをdevelopに強制一致
git fetch origin
git reset --hard origin/develop
強制的にチェックアウト
git checkout --force <ブランチ名>
プッシュを取り消す(完全に無かったことになるが、取り消し履歴も残らないので注意)
git log --oneline
git reset --hard xxxxxxx
git log --oneline
git push -f ... 強制プッシュ。ユーザ名とパスワードを入力する
取り消した内容を他の環境に反映させる場合、
「Sourcetreeでgitを操作する」の「masterにマージしてプッシュした内容を無かったことにした内容を他の環境に取り込む」を参照
コミットのコメントは、直前の内容のみ編集できる
Sourcetreeのコミット画面で「オプションのコミット」を「最後のコミットを上書き(Amend)」にし、コメントを修正してコミットする
Gitでやらかした時に使える19個の奥義 - Qiita
https://qiita.com/muran001/items/dea2bbbaea1260098051
gitでmasterを過去のある位置に戻すには - uehatsu's tech blog
https://uehatsu.info/tech/archives/2015/03/rewind-the-master-on-git.html
なおリベースを使用すれば、一応は過去のコミットのコメントを編集できる
ただし強制プッシュが必要でリスクがあるので、自分1人の個人プロジェクト以外では使わない方が無難だと思われる
また個人プロジェクトであっても、コメントを編集するとコミット日時が編集時点のものになってしまうみたい
後から作業履歴を振り返るときに問題があるので、やはり過去のコミットは原則編集しない方が良さそう
Gitコミットメッセージ間違えた時、SourceTreeでの対処法 | 株式会社 エヴォワークス -EVOWORX-
https://www.evoworx.co.jp/blog/editing-commit-messages-with-sourcetree/
git pushを取り消す
http://tweeeety.hateblo.jp/entry/2015/06/10/215753
git reset --hard で指定した時点の履歴に戻る方法
http://blog.roundrop.jp/show/37
git log --oneline のお供に --no-merges
http://qiita.com/hattorix@github/items/f18b172aafe1340d87f6
困った時の逆引きGitメモ
http://myenigma.hatenablog.com/entry/2016/07/09/190058
gitでリモートのブランチにローカルを強制一致させたい時
http://qiita.com/ms2sato/items/72b48c1b1923beb1e186
GitでリモートにPushした内容を取り消したい!!
http://grandbig.github.io/blog/2016/07/16/git-reset/
Git で コミットを無かったことにする方法 (git revert の使い方)
http://akiyoko.hatenablog.jp/entry/2014/08/21/220255
git revertでmerge commitを取り消す
http://qiita.com/shizuma/items/313ed581e071f53a4d2e
【派閥別】Gitのコミットを間違えたときの対処法まとめ
http://freak-da.hatenablog.com/entry/20111105/p1
gitでいろいろ取り消したい - Qiita
https://qiita.com/tani-shi/items/3419600447292abf6c79
Gitで過去のバージョンに戻す(チェックアウト) - JavaScript勉強会
http://jsstudy.hatenablog.com/entry/Checkout-with-Git
SourceTreeでコミットを取り消す | cly7796.net
http://cly7796.net/wp/other/cancel-the-commit-sourcetree/
「git checkout .」と「git reset」の違いは以下が参考になる
基本的に「git checkout .」で良いかも
Git - リセットコマンド詳説
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E...
Git強制チェックアウト - Qiita
https://qiita.com/ryotaro76/items/ca4c504e290d088aaa4c
以下は未検証だが参考になるかも
githubに間違って機密データを上げてしまった時の対処 - Qiita
https://qiita.com/dynamonda/items/fa99d141c44098890be3
■マージの取り消しについて考察
「Sourcetreeでgitを操作する(応用)」の「masterにマージしてプッシュした内容を無かったことにする(推奨手順)」を確認する
以下はそれとは別に色々と調べた内容
■マージの取り消し(プッシュはしていない)について考察
プッシュしていなければ、以下でマージを取り消せる
間違えてマージした直後にhardの方を実行すれば良さそう
直前のコミットを取り消し(作業内容は残る)
git reset --soft HEAD^
直前のコミットを取り消し(作業内容も消える)
git reset --hard HEAD^
GUIで操作するなら、戻りたいコミットを右クリックして「現在のブランチをこのコミットまでリセット」で良さそう
Hardにすればマージ内容を取り消せる
なお、そのままプッシュすればリモートリポジトリの内容も巻き戻せるかもしれない
とはいえ、それは
「プッシュを取り消す(完全に無かったことになるが、取り消し履歴も残らないので注意)」
を実行しているのと同じのはず
リモートリポジトリも含めて確認してみたい
引き続き、間違えてマージしてプッシュもしたときの対応を検証
■マージの取り消し(プッシュもした)について考察
間違えてマージしてプッシュもしたときの対応を検証したときのメモ
git merge の取り消し方法。reset と revert コマンドについて。 | WWWクリエイターズ
https://www-creators.com/archives/2111
【git】マージしたけどやっぱりやめたい時のやり方4種類 - Qiita
https://qiita.com/chihiro/items/5dd671aa6f1c332986a7
revertでマージの取り消しはできるものの、後からの再マージが無視されるなど色々問題がある
gitでまだマージしたくない変更を間違ってmasterにマージしてしまった時の対処 - @satomikko94.b
https://satomikko94.hatenablog.com/entry/2014/06/30/235603
revertのrevert(取り消しの取り消し)をすれば打ち消した内容を復元できるが、履歴も含めて管理がややこしそう
結論として「間違えてdevelopをmasterにマージしてプッシュもしてその後作業もしてしまった」ような場合は取り消しは難しそう
特定ブランチへのマージを禁止する、などで対応すべきか
マンガでわかるGit 10話「masterブランチを守れ!〜危険な強制プッシュ〜」 | リクナビNEXTジャーナル
https://next.rikunabi.com/journal/20170516_t12_iq/
上記のとおり一応できるが、「featureからdevelopへのマージを一定期間だけ禁止したい」のような場合には対応が難しい
以下、色々と検証した内容のメモ
「常にこういう操作で対応できる」というものは無さそう
前提:
develop から feature/test を作って作業した
まだマージすべきではなかったが、feature/test を develop にマージしてプッシュもしてしまった
これを取り消せるか
対処法1:
developブランチに切り替えておく
マージのコミットではなく、打ち消したいコミットを右クリックして「このコミットを打ち消し」としてみる
developブランチからは作業内容が消えた。feature/testブランチには作業内容が残っている
本来マージすべきタイミングになってから feature/test を develop にマージしても何も起きない
なぜなら「マージした」という履歴が残っているから
つまり完全な取り消しができているわけでは無い
対処法2:
developブランチに切り替えておく
マージのコミットではなく、打ち消したいコミットを右クリックして「このコミットを打ち消し」としてみる
developブランチからは作業内容が消えた。feature/testブランチには作業内容が残っている
develop を feature/test にマージする
これにより「打ち消し」の作業内容がマージされる
作業ブランチからも作業内容が消えているので、自身のブランチの履歴からチェリーピックで作業内容を復元する
ただしチェリーピックでの復元なので、作業コミット数が多い場合は作業が大変だし履歴もゴチャゴチャする
本当の意味でのマージ取り消しにはなっていない
対処法3:
developブランチに切り替えておく
マージのコミットではなく、打ち消したいコミットを右クリックして「このコミットを打ち消し」としてみる
developブランチからは作業内容が消えた。feature/testブランチには作業内容が残っている
本来マージすべきタイミングになってから、打ち消したコミットを右クリックして「このコミットを打ち消し」としてみる
これにより、打ち消された内容を復元できる
ただし「マージ間違いがあったのでコミットを打ち消したんだ」ということを覚えておかないと、間があくと「なぜかマージできない」と悩むかもしれない
また、「打ち消したコミットをさらに打ち消す」前に feature/testブランチでの追加作業を取り込んでしまうとコンフリクトが発生するはず
本当の意味でのマージ取り消しにはなっていない
結局のところ、何が何でもきれいに取り消すのなら
「プッシュを取り消す(完全に無かったことになるが、取り消し履歴も残らないので注意)」
でマージもプッシュも完全に取すくらいか
ただし他の人が作業を取り込んだ後だと混乱するので、「絶対に他の人が作業を取り込んでいない」と断言できる状態でのみ使えるものだと思われる
また、必要なコミットが本番環境で消えたりすると問題なので、やはり原則使わない方が無難