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

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

我有一个experiment分支,在其中进行了大量更改和大量提交。现在,我希望将仅对app.js进行的所有更改从experiment转移到master分支。

我怎么做?

再一次,我不想合并。我只想将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 如何撤消对一个文件的更改?


更新 2019 年 8 月,Git 2.23:使用新的git switchgit restore命令,将是:

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

默认情况下,仅还原工作树。
如果您还想更新索引(意味着还原文件内容, 通过一个命令将其添加到索引中):

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

正如雅库布 · 纳伦斯基(JakubNarębski )在评论中提到的那样:

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

除 SO 问题 “ 如何从 Git 中的特定修订版本检索单个文件? ” 中详述的之外,该方法也可以工作,您需要使用来自仓库的根目录的完整路径。
因此,Jakub 在他的示例中使用了 path / 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
git checkout branch_name file_name

例:

git checkout master App.java

如果您的分支机构名称中包含句点,则此方法将无效。

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

或者,如果您希望来自另一个分支的所有文件:

git checkout <branch name> -- .

查看 github 上的文件并从那里拉出

这是一种务实的方法,不能直接回答 OP,但发现有些有用:

如果相关分支位于 GitHub 上,则可以使用 GitHub 提供的许多工具中的任意一个导航到所需的分支和文件,然后单击 “原始” 以查看纯文本,并(可选)将文本复制并粘贴为想要的。

我喜欢这种方法,因为它可以让您在将远程文件拉到本地计算机之前完整地查看它。

如果要从特定提交(任何分支)中获取文件,请说 06f8251f

git checkout 06f8251f path_to_file

例如,在 Windows 中:

git checkout 06f8251f C:\ A \ B \ C \ D \ file.h

git checkout master               -go to the master branch first
git checkout <your-branch> -- <your-file> --copy your file data from your branch.

git show <your-branch>:path/to/<your-file>

希望这会帮助你。如果您有任何疑问,请告诉我。