git checkout $(git log -1 --pretty='%h' -- <path>)^ -- <path>
壊す
git log
目的のファイルに影響を与える最後のコミットを見つけるために使用します
$(git log -1 --pretty='%h' -- <path>)
- ハッシュのみを表示するフォーマットを
git log
使用してコマンドを実行します。--pretty
- 区切り記号を使用して
--
、コミット参照ではなくファイルを明示的に指定します。
- 取得するファイルのパスとファイル名が続きます。
- これをすべてラップして
$()
、変数のような別の git コマンドに埋め込むことができます。
- これは、指定されたファイルが削除されたコミットを返します。
$()
もちろん、そのファイルがいつ削除されたかを知りたい場合は、これを単独で使用できます。きれいなフォーマットを変更または削除すると、見つかったコミットに関する詳細情報が得られます。
git checkout
特定のコミットにあったファイルを取得するために使用する
git checkout <ref>^ -- <path>
git checkout
コミットを使用し、パスを指定して実行します。
- パスが指定されると、git は指定された参照でそのパスの状態を単純に再作成します。
- ニンジン
^
を参照に追加することで、実際には直接の祖先を指します。
- ログから取得したコミットにはファイルがないため、直接の祖先が必要です-ファイルが削除されたコミットであるためです。
すべてをまとめると、ファイルが削除される直前のコミットの状態でファイルをチェックアウトしています。削除されていないファイルに対してこれを実行すると、そのファイルに対して最後に行われた変更が元に戻されます。
エイリアス
git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"'
unrm
un-remove のように、これから というエイリアスを作成しました。上記のコマンドを実行すると、それ以降は実行するだけで済みます。
git unrm <path>
編集:コマンドにフィードバックを追加しました。
git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"; echo "File: $1, was restored from commit $COMMIT"; git show -s $COMMIT'
これで、実行した内容が通知され、ファイルの復元元のコミットが表示されます。