How do I copy a version of a single file from one Git branch to another? How do I copy a version of a single file from one Git branch to another? git git

How do I copy a version of a single file from one Git branch to another?


Run this from the branch where you want the file to end up:

git checkout otherbranch myfile.txt

General formulas:

git checkout <commit_hash> <relative_path_to_file_or_dir>git checkout <remote_name>/<branch_name> <file_or_dir>

Some notes (from comments):

  • Using the commit hash, you can pull files from any commit
  • This works for files and directories
  • Overwrites the file myfile.txt and mydir
  • Wildcards don't work, but relative paths do
  • Multiple paths can be specified

An alternative:

git show commit_id:path/to/file > path/to/file


I ended up at this question on a similar search. In my case I was looking to extract a file from another branch into current working directory that was different from the file's original location. Answer:

git show TREEISH:path/to/file > path/to/local/file


I would use git restore (available since Git 2.23):

git restore --source otherbranch path/to/myfile.txt


Why is it better than other options?

git checkout otherbranch -- path/to/myfile.txt - It copy file to working directory but also to staging area (similar effect as if you would copy this file manually and executed git add on it). git restore doesn't touch staging area (unless told it to by --staged option).

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt uses standard shell redirection. If you use PowerShell then there might be problem with text encoding or you could get broken file if it's binary. With git restore changing files is done all by the git executable.

Another advantage is that you can restore the whole folder with:

git restore --source otherbranch path/to

or with git restore --overlay --source otherbranch path/to if you want to avoid deleting files. For example, if there are fewer files on otherbranch than in the current working directory (and these files are tracked) without --overlay option git restore will delete them. But this is good default behaviour, you most likely want the state of directory to be "the same like in otherbranch", not "the same like in otherbranch but with additional files from my current branch".