2021年9月18日 git resetとgit revertについて
git resetコマンド
間違えて"git add"、"git commit"をした場合、"git reset"を行うことでそれらの操作をなかったことにできます。コミットidを指定すると、指定したコミットまで戻ります。 resetはコミットIDを指定したコミット時点まで戻るが指定したコミットより新しい履歴が消えてしまうので リモートにプッシュしてからresetを使うと最終的に整合性が取れずコンフリクトを起こす場合があります。
reset --hard :add、commit、ワーキングツリーの取り消し
「ステージングエリアにも作業ディレクトリにも残らなくていいから、コミットをまるごと消したい」というときに使えるコマンドです。
# ひとつ前のコミットまでまるごと消したい $ git reset --hard HEAD^
reset --mixed :commitとaddの取り消し
# ステージしたものを取り消したい $ git reset --mixed HEAD # オプション無しでも--mixedを実行したときと同じ結果が得られます $ git reset HEAD
reset --soft :commitのみ取り消し
# 直前のコミット内容を修正したい $ git reset --soft HEAD^
画像引用
※HEADというのは、「自分が今いる位置」のことです。たいていはブランチの先頭のコミットを指していることが多いですが、それを過去のコミットに移動させることで、ブランチを過去に巻き戻すわけだが、そのときにステージも道連れにするのがmixedで、ステージも作業ディレクトリも道連れにするのがhardです。
※HEADの代わりにコミットIDを指定することもできます。コミットIDを使うと、指定した時点まで「HEAD・ステージングエリア・作業ディレクトリ」のすべてが巻き戻されます。
※git reset --hardを使う場合は、プッシュ前のコミットに対してのみ、使うようにする。
# 指定したコミットID時点までのHEAD・ステージングエリア・作業ディレクトリの状態が元に戻る $ git reset --hard 02f11b7
git reflogコマンド
HEADでの動きが履歴として一覧表示することが出来ます。
・新規コミット(コミット、マージ、プル、リバートなど)
・ブランチの切り替え(チェックアウト)
・履歴の書き換え(リセット、リベースなど)
このコマンドとgit resetコマンドを使うことで、間違えてリセットしてしまっても指定した時点に戻すことが出来ます。
# 操作履歴を見る $ git reflog # 以下操作一覧 02f11b7 HEAD@{0}: reset: moving to 02f11b7 0488e28 HEAD@{1}: merge develop: Merge made by the 'recursive' strategy. 6978c20 HEAD@{2}: checkout: moving from develop to master#=> 間違えてresetしてしまった時点 32275f0 (develop) HEAD@{3}: commit: 制作事例を追加 0e95561 HEAD@{4}: checkout: moving from master to develop 6978c20 HEAD@{5}: commit: 3回目のコミット 0e95561 HEAD@{6}: commit: 2回目のコミット 02f11b7 HEAD@{7}: commit (initial): はじめてのコミット # resetの操作をする前(1つ前)に戻したい場合 $ git reset --hard HEAD@{1} #=> 間違えて実行してしまったコマンドの1つ前まで戻る
git revert
revertはコミットの履歴自体は消さずに、指定したコミットidを作る前の状態に戻れます(結果としてコミットを消した状態になります)。 revertで指定したコミットを打ち消すようなコミットを作成します。そのコミットがあるおかげで、指定したコミットがなかったことになります。 間違えた時点で、新たにコミットをしてその作成したコミットをrevertすることで、間違える前の状態に戻れます。(ただし、コミットした履歴は残っています。)
$ git revert 消したいコミットid
ポケモンに例えると
ジムリーダーに初挑戦する前にコミットして、負けたときに挑戦前に戻りたい場合
負けた後に新しくコミットする→負けた後の最新のコミットIDをgit revert コミットID
にして実行する→ジムリーダーに初挑戦時に戻ります。
参照
第5話 プッシュ済みのコミットを取り消したい!リバートの使い方【連載】マンガでわかるGit ~コマンド編~
第6話 git reset 3種類をどこよりもわかりやすい図解で解説!【連載】マンガでわかるGit ~コマンド編~