关于git:如何从另一个分支中获取一个文件

How to get just one file from another branch

我正在使用git并在master branch上工作。这个分支有一个名为app.js的文件。

我有一个experiment分支,在其中我做了大量的更改和承诺。现在,我只想把所有对app.js所做的更改从experiment转到master分支。

我该怎么做?

我又一次不想合并。我只想把app.js的所有变化从experiment分公司带到master分公司。


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

另请参见Git如何撤消一个文件的更改?

作为Jakub Nar?BSKI在评论中提到:

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

除此之外,它也可以工作,正如so问题"如何从git中的特定修订中检索单个文件"中详述的那样。,您需要使用repo根目录的完整路径。因此,Jakub在其示例中使用的路径/to/app.js。

正如弗罗斯蒂在评论中提到的:

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

但是,对于git checkoutgit show,您实际上可以引用您想要的任何修订,如问题"git gui中文件的git checkout revision"所示:

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

相同的是$filename是版本化文件的完整路径。

$REVISION可以如git rev-parse所示:

1
2
3
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

等等。

施密霍斯在评论中补充道:

you also can do this from a stash:

1
git checkout stash -- app.js

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


一切都很简单,使用git checkout。

假设you're on master支,得到app.js from new-feature支:

1
2
3
git checkout new-feature path/to/app.js

// note that there is no leading slash in the path!

这将为您带来所需文件的内容。您可以像往常一样,使用sha1的一部分而不是新的功能分支名称来获取文件,因为它在那个特定的提交中是这样的。


对VONC和CHHH答案的补充。

1
2
3
git show experiment:path/to/relative/app.js > app.js
# If your current working directory is relative than just use
git show experiment:app.js > app.js

1
git checkout experiment -- app.js


1
git checkout branch_name file_name

例子:

1
git checkout master App.java

如果您的分支名称中有句点,这将不起作用。

1
2
git checkout"fix.june" alive.html
error: pathspec 'fix.june' did not match any file(s) known to git.


或者,如果您需要来自其他分支的所有文件:

1
git checkout <branch name> -- .


查看Github上的文件并从中拉出

这是一种务实的方法,它不会直接回答OP,但有些人认为这是有用的:

如果有问题的分支在Github上,那么您可以使用Github提供的许多工具中的任何一个导航到所需的分支和文件,然后单击"原始"查看纯文本,并(可选)根据需要复制和粘贴文本。

我喜欢这种方法,因为它允许您在将远程文件拖到本地计算机之前查看整个文件。