問題
昨日作業したファイル(例えば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
という風に特定のコミットからファイルを取り出せます。