--no-commit を使用して変更を保持したまま元に戻す
コミットの変更を取り消したいが、それを変更するために作業ディレクトリに保持したい場合があります。例えば、コミット全体を破棄するのではなく、コミット内の間違いを修正したい場合などです。--no-commit(または -n)オプションは、この目的に最適です。
まず、別の方法を試せるように、最後のリバート前の状態にリポジトリをリセットしましょう。これには git reset を使用します。このコマンドは HEAD ポインタを移動し、--hard は作業ディレクトリのファイルをそれに合わせて更新します。
git reset --hard HEAD~1
このコマンドは、先ほど行った「Revert」コミットを削除します。git log --oneline を実行して確認できます。
次に、「unwanted」コミットを再度リバートしますが、今回は --no-commit オプションを使用します。「Add a second, unwanted line」コミットのハッシュを使用することを忘れないでください。
<your-commit-hash> は、ターミナルから取得した実際のハッシュに置き換えてください。
git revert --no-commit <your-commit-hash>
今回はエディタは起動しません。リバートの準備はできましたが、コミットされていません。リポジトリのステータスを確認しましょう。
git status
出力は story.txt がコミットのためにステージングされていることを示します。
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: story.txt
リバートされたコミットからの変更が、ステージングエリアに入りました。これで変更を加えることができます。不要な行をより良いものに置き換えましょう。nano で story.txt を開きます。
nano story.txt
ファイルは、ステップ 2 のリバート後の状態のようになります。ファイルの末尾に、新しくより良い行を追加します。
And they lived happily ever after.
nano で保存して終了します(Ctrl+O、Enter、Ctrl+X)。
次に、変更をステージングエリアに追加し、新しい説明的なメッセージでコミットします。
git add story.txt
git commit -m "Replace unwanted line with a proper conclusion"
最後に、ログとファイルの内容を確認して結果を見てみましょう。
git log --oneline
cat story.txt
ログには新しいコミットが表示され、story.txt には修正された内容が含まれています。コミットの変更を保持・修正しながら、コミットを正常にリバートしました。