我有一个名为app.js的主分支。我在一个实验分支上对这个文件进行了更改。
我只想将实验中对app.js所做的更改应用到master分支。
我有一个名为app.js的主分支。我在一个实验分支上对这个文件进行了更改。
我只想将实验中对app.js所做的更改应用到master分支。
当前回答
或者,如果您想要其他分支的所有文件:
git checkout <branch name> -- .
其他回答
查看github上的文件并从那里取出
这是一种务实的方法,不会直接回答OP,但有些人发现很有用:
如果有问题的分支位于GitHub上,那么您可以使用GitHub提供的许多工具中的任何一个导航到所需的分支和文件,然后单击“原始”查看纯文本,并(可选)根据需要复制和粘贴文本。
我喜欢这种方法,因为它允许您在将远程文件拉到本地计算机之前查看其完整性。
一切都简单多了,用git结账。
假设您在master分支上,要从新功能分支获取app.js,请执行以下操作:
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, then just use:
git show experiment:app.js > app.js
or
git checkout experiment -- app.js
要从另一个分支恢复文件,只需使用工作分支中的以下命令:
git restore -s my-other-branch -- ./path/to/file
-s标志是source的缩写,即要从中提取文件的分支。
(所选的答案信息量很大,但也有点令人难以理解。)
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 switch和git restore命令,将是:
git switch master
git restore --source experiment -- app.js
默认情况下,仅恢复工作树。如果您也想更新索引(即恢复文件内容,并在一个命令中将其添加到索引中):
git restore --source experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -SW -- app.js
正如Jakub Narğbski在评论中提到的:
git show experiment:path/to/app.js > path/to/app.js
除了SO问题“How to retrieve a single file from specific revision in Git?”中详述的那样,您需要使用repo根目录的完整路径。因此Jakub在其示例中使用了/to/app.js路径。
正如Frosty在评论中提到的:
您将只获得app.js的最新状态
但是,对于git checkout或git show,您实际上可以引用所需的任何修订,如SO问题“git gui中文件的git checkout-revision”所示:
$ 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
等等
施密特在评论中补充道:
你也可以从一个储藏处做到这一点:git签出存储--app.js如果您正在处理两个分支,并且不想提交,这非常有用。