LoginSignup
29
29

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-25

問題

昨日作業したファイル(例えば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

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

29
29
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
29