回答:
達成したいことに基づいて、さまざまなオプションがあります。
ファイルの内容をターゲットブランチと同じにする場合は、を使用できますgit checkout <branch> -- <filename>
。ただし、これは単一のコミットで発生した変更を「選択」するのではなく、そのファイルの結果の状態を取得するだけです。したがって、コミットに行を追加したが、以前のコミットがさらに変更され、他の変更を加えずにその行のみを追加したい場合、チェックアウトは希望どおりではありません。
それ以外の場合、コミットで導入されたパッチを単一のファイルにのみ適用する場合は、複数のオプションがあります。実行できますgit cherry-pick -n
。つまり、コミットせずに、コミットを編集します(たとえば、を使用git reset -- .
してすべてのファイルをリセットし、実際に変更したいファイルのみを使用して追加しますgit add <filename>
)。または、ファイルの差分を作成し、その差分を適用することもできます。
git diff <branch>^..<branch> -- <filename> | git apply
を作成しpatch file
て適用します。
git diff branchname -- filename > patchfile
git apply patchfile
編集:
変更をコミットから取得する必要があるため、次のようなパッチを作成します。
git show sha1 -- filename > patchfile
git diff sha1
(またはgit diff branch
、ブランチが同じハッシュを指している場合は同じです)、そのハッシュに関して現在の作業ディレクトリの差分のみを生成しますが、それ自体で導入されたコミットを変更するものは生成しません。
git checkout
ファイル名付きの-1 は、この爪に最適なハンマーです。これらのオプションはどちらも不必要に複雑です。
checkout
場合は、機能しません。これには、他の不要な以前の変更が含まれている可能性があり、現在のブランチで行われた変更が含まれていない可能性があるためです。
もう1つの便利なことは、ローカルでパッチを入手して使用することです。
git checkout {<name_of_branch>, commit's SHA} <path to the file>
それはチェリーピッキングではありませんが。
Gitはすべて準備が整っています:)
使うだけ
git checkout <sha> <path-to-file>
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension
これは、別のブランチの単一のファイルを現在作業中のブランチにコピーする場合に機能します
私がしがちなのは使うことです git ls-tree
ただやる:
git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'
これは、grepに一致するすべてのファイル名を出力し、コミット内のファイルのSHA1キーを提供します。
Gitショーはブランチ外のファイルにも使用できます。>
シェルから使用して出力をファイルにパイプすると、探している結果が得られます。