协慌网

登录 贡献 社区

如何从另一个分支中获取一个文件

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

我有一个experiment分支,其中我进行了一系列更改和大量提交。现在我希望把做只对所有变化app.jsexperimentmaster分支。

我怎么做?

再一次,我不想合并。我只想将app.js所有更改从experiment分支转移到master分支。

答案

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

另请参阅git 如何撤消一个文件的更改?

正如JakubNarębski在评论中提到的那样:

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

也可以工作,除了如 SO 问题 “ 如何从 Git 中的特定修订中检索单个文件? ” 中详述的那样,您需要使用 repo 根目录中的完整路径。
因此,Jakub 在他的例子中使用了路径 / to / app.js。

正如Frosty在评论中提到的那样:

你只会获得 app.js 的最新状态

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

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

将是相同的是 $ FILENAME 是版本化文件的完整路径

$REVISION可以如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

等等。

schmijos 在评论中补充道:

你也可以从藏匿处做到这一点:

git checkout stash -- app.js

如果您正在处理两个分支并且不想提交,那么这非常有用。

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

假设you're on master分支上, app.js from new-feature分支获取app.js from new-feature

git checkout new-feature path/to/app.js

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

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

补充 VonC 和 chhh 的答案。

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

要么

git checkout experiment -- app.js