Git
checkout

gitで、特定のコミットからファイルを取り出す方法

問題

昨日作業したファイル(例えばHEAD^^^にある)が欲しい時、どうしましよう

  • github, bitbucketなどから copy & paste; バージョン管理できてない気がします、ファイル数が多い時手間がかかります。
  • HEAD^^^へチェックアウトする; 直近のコミットの内容がなくなります。
  • checkout + cherry-pick; ちょっと手間、、
  • rebase; コミット履歴を消すまでやるのは、、、

結論

git checkout COMMIT_SHA -- FILE_NAMEを使います。
COMMIT_SHA: コミットのSHA番号; HEAD~;ブランチ名(develop)などの記述も可
FILE_NAME: 取り出したいファイルの名前(現ワーキングスペースになくても、つまりどこかのコミットで削除されたファイルでもおっけー)
-- なくてもいけますが、FILE_NAMEと同じなブランチ名がある時必要

git checkout

git checkoutは主にブランチの切り替えとファイルのバージョン管理ができます。

ブランチの切り替え

git checkout TARGET_BRANCH_NAME

でターゲットのブランチに切り替えるのが一番馴染み深い使い方です。

インデックスにあるファイルへの変更のアンステージング

例えばあるブランチの中にtmpというファイルがすでにコミットされていました。

echo changes >> tmp
git status

という風に、tmpファイルを修正しました。しかし後になって、やっぱりこの変更をコミットしないと決めた時
git statusで表示した手順でアンステージングできます

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   tmp

つまり

git checkout -- tmp

イコール

git checkout HEAD -- tmp

を入力すれば、tmpをHEADの状態に戻せます。

特定のコミットからファイルを取り出す

実は、上記の例を活用すれば

git checkout HEAD^^ -- targetFile
git checkout COMMIT_SHA -- targeFile

という風に特定のコミットからファイルを取り出せます。