06revertとreset
revert
特定のコミットだけを取り消したいが、コミット履歴自体は保持したい場合、revertコマンドを使用します。
revertコマンドは、特定のコミットの変更内容を元に戻す新しいコミットを作成するためのコマンドです。

// 事前準備:先ほどのstashでの変更をステージ→コミット
git add .
git commit -m "stash practice"
// やっぱり、↑ のコミットは消したいな、、
// "stash practice"のコミット番号をコピペ
git log
git revert コミット番号すると、確認がターミナルに出ると思うので、「Ctrl + X」で閉じると、ファイルは以下の状態になっていると思います。

これで”stash practice”の変更内容が打ち消せていることが分かりました。
reset
resetはrevertと同じく、コミットを取り消したい時に使います。revertとは違い、指定された状態にリセットすることが可能となります。
resetで主に使用する3種類を紹介します。
①soft:コミットしたという事実だけが消える。ワークツリーやインデックスのステージ状況はコミット前と比べて変わらない。
git reset --soft
②mixed:コミットとステージした内容が消える。コミット前にステージしていた変更点は、ワークツリーに反映される。
git reset --mixed
// もしくは↓
git reset 
③hard:コミットしていない変更がすべて消える。まっさらになる。
git reset --hard
上記3種類をシチュエーションによって使い分けます。
今回はgit resetのデフォルト動作であるmixedを試してみましょう。(自由に他のコマンドも試してもらって大丈夫です!)
// masterブランチに移動する
git checkout master
// 新しいブランチbranch_resetを作成しチェックアウト
git checkout -b branch_reset
// "reset test string"という文字列を追加し、ステージ→コミット
echo "reset test string" >> file01
git add .
git commit -m "reset test"
// 巻き戻したい箇所のコミット番号を確認
git log
一番上にreset testのコミット、その下にその前のコミットが出てきます。
今回は「reset testを取り消す」ことがしたいので、すなわち、「1bc373aba9e743aef4c6521c0e2d1982c69da280」のコミット番号まで戻りたいということになります。よって、以下のコマンドを実行します。
// コミットのハッシュ値は皆さんそれぞれのものを設定してください
git reset 1bc373aba9e743aef4c6521c0e2d1982c69da280これで「1bc373aba9e743aef4c6521c0e2d1982c69da280」までのコミットは取り消せたことになっています。差分を確認してみましょう。
git diff
コミットしていた”reset test string”の文字列が、ステージする前の状態で追加されています。git reset のデフォルトの動きは- -mixedの動きだったので、期待通り、変更点がワークツリーに反映された状態になっています。
※補足
resetとは別の話にはなりますが、ワークツリーの変更をリセットしたい時に下記のコマンドが使えます。
// ワークツリーの変更点をまとめてリセットする
git checkout .補足:revertとresetの注意点
- reset、revertを使用していいかはプロジェクトの規則による。
→正しく使用すれば大変便利な機能ですが、間違えて使うと変更履歴を改変してしまうこともあります。ゆえに、プロジェクトでresetやrevertの使用が禁止されている場合があります。
コメントを残す