演習 - Git を使用して間違いを修正する

完了

次に、誤りを修正するための実践的な方法をいくつか紹介しましょう。

削除されたファイルを復旧する方法

  1. 最初に、index.html を削除してみます。

    rm index.html
    

    これは、不適切に思えるかもしれませんが、思い出してください。Git があなたの後ろについています。

  2. ls コマンドを使って、index.html が削除されたことを確認します。

    ls
    
  3. 次の出力が表示されます。 ここで、index.html ファイルがないことに注意してください。

    CSS
    
  4. index.html を復旧してみましょう。 git checkout を使って、index.html を元に戻します。

    git checkout -- index.html
    
  5. ls をもう一度使って、現在のディレクトリの内容を確認します。 index.html は復元されていますか。

    はい、されています。 出力には、index.html ファイルと CSS ディレクトリが含まれるようになっています。

    CSS  index.html
    

git rm で削除されたファイルを復旧する方法

削除されたファイルを復旧する場合でも、rm ではなく git rm を使用して削除されていると、話はもう少し複雑になります。

  1. 次のコマンドを試し、何が起こるかを確認してみてください。

    git rm index.html
    
  2. ここでも、ls を実行して index.html を探します。 index.html は表示されません。

  3. 前回と同じように index.html を復旧してみてください。

    git checkout -- index.html
    
  4. 今度は、Git で index.html が認識されないというエラーが発生します。 これは、Git でファイルが削除されただけでなく、インデックスに削除が記録されたためです。

    error: pathspec 'index.html' did not match any file(s) known to git.
    
  5. git reset コマンドを使って、index.html の削除をステージング解除します。

    git reset HEAD index.html
    
  6. この出力を調べると、次のように確認されています。

    Unstaged changes after reset:
    D       index.html
    
  7. これで、前に使ったコマンドで、インデックスからファイルを復旧できるようになりました。

    git checkout -- index.html
    

    git reset によって変更のステージングは解除されましたが、ファイルは削除されたままなので、checkout を使って元に戻す必要がありました。

  8. ls を実行して、うまくいったことを再確認します。

コミットを元に戻す

それでは、さらに複雑にしてみましょう。 あるファイルを誤って別のファイルで上書きした場合や、ファイルに対して行った変更が大きな誤りであることが判明した場合を考えてみます。 以前のバージョンのファイルに戻す必要がありますが、既に変更をコミットしてあります。 この場合、単純な git checkout ではうまくいきません。

この問題の解決策の 1 つは、前のコミットを元に戻すことです。

  1. codeindex.html を開きます。

    code index.html
    
  2. index.html の内容を、次のコードに置き換えます。

    <h1>That was a mistake!</h1>
    
  3. ファイルを保存して閉じます。

  4. 次のコマンドを使って変更をコミットし、最新のコミットを表示します。

    git commit -m "Purposely overwrite the contents of index.html" index.html
    git log -n1
    

    ここで、-n1 フラグは、最新のコミット エントリのみが必要であることを Git に指示します。

  5. 次のコマンドを使って、index.html の復元を試みます。

    git checkout -- index.html
    
  6. エディターで index.html を開きます。

    code index.html
    

    index.html のどのバージョンが表示されますか。 古いバージョンですか、新しいバージョンですか。

    このような状況での最善の方法は、最初のコミットをキャンセルする別のコミットを行って、変更を "元に戻す" ことです。 それは git revert の仕事です。

  7. ファイルを閉じ、git revert を使って、コミットされた変更を元に戻します。

    git revert --no-edit HEAD
    

    --no-edit フラグは、この操作に対するコミット メッセージを追加しないことを Git に指示します。

  8. 出力を確認します。 次の例のようになります。

    [main 6a27310] Revert "Purposely overwrite the contents of index.html"
    1 file changed, 13 insertions(+), 1 deletion(-)
    
  9. git log コマンドを実行して、最新のコミットを表示します。

    git log -n1
    
  10. 出力をもう一度確認します。 これはこの例のようになるはずです。

    Author: User Name <user-name@contoso.com>
    Date:   Tue Nov 19 23:42:26 2019 +0000
    
    Revert "Purposely overwrite the contents of index.html"
    
    This reverts commit 15d3bded388470c98881a632025bc15190fe9d17.
    
  11. 最後に、index.html ファイルを開き、内容が正しいバージョンであることを確認します。

この状況を解決する方法は、元に戻すことだけではありません。単に index.html を編集し、修正されたファイルをコミットすることもできます。 この選択肢は、コミットした変更が広範囲にわたる場合は困難です。 どのような場合でも、git revert は意図を示すのに適した方法です。