Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get just one file from another branch?

I am using Git and working on master branch. This branch has a file called app.js.

I have an experiment branch in which I made a bunch of changes and tons of commits. Now I want to bring all the changes done only to app.js from experiment to master branch.

How do I do that?

Once again I do not want a merge. I just want to bring all the changes in app.js from experiment branch to master branch.

like image 845
Nick Vanderbilt Avatar asked Mar 02 '10 15:03

Nick Vanderbilt


People also ask

Can I pull only one file from git?

Short Answergit checkout origin/master -- path/to/file // git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).

How do I clone a single file in git?

You can't clone a single file using git. Git is a distributed version control system, the Idea behind its clone functionality is to have a complete copy of project and all versions of files related to that project.


2 Answers

git checkout master               # first get back to master git checkout experiment -- app.js # then copy the version of app.js                                    # from branch "experiment" 

See also git how to undo changes of one file?


Update August 2019, Git 2.23

With the new git switch and git restore commands, that would be:

git switch master git restore --source experiment -- app.js 

By default, only the working tree is restored.
If you want to update the index as well (meaning restore the file content, and add it to the index in one command):

git restore --source experiment --staged --worktree -- app.js # shorter: git restore -s experiment -SW -- app.js 

As Jakub Narębski mentions in the comments:

git show experiment:path/to/app.js > path/to/app.js 

works too, except that, as detailed in the SO question "How to retrieve a single file from specific revision in Git?", you need to use the full path from the root directory of the repo.
Hence the path/to/app.js used by Jakub in his example.

As Frosty mentions in the comment:

you will only get the most recent state of app.js

But, for git checkout or git show, you can actually reference any revision you want, as illustrated in the SO question "git checkout revision of a file in git gui":

$ git show $REVISION:$FILENAME $ git checkout $REVISION -- $FILENAME 

would be the same is $FILENAME is a full path of a versioned file.

$REVISION can be as shown in git rev-parse:

experiment@{yesterday}:app.js # app.js as it was yesterday  experiment^:app.js            # app.js on the first commit parent experiment@{2}:app.js         # app.js two commits ago 

and so on.

schmijos adds in the comments:

you also can do this from a stash:

git checkout stash -- app.js 

This is very useful if you're working on two branches and don't want to commit.

like image 179
VonC Avatar answered Oct 30 '22 09:10

VonC


Everything is much simpler, use git checkout for that.

Suppose you're on master branch, to get app.js from new-feature branch do:

git checkout new-feature path/to/app.js  // note that there is no leading slash in the path! 

This will bring you the contents of the desired file. You can, as always, use part of sha1 instead of new-feature branch name to get the file as it was in that particular commit.

Note:new-feature needs to be a local branch, not a remote one.

like image 45
Dmitry Avtonomov Avatar answered Oct 30 '22 10:10

Dmitry Avtonomov