Git:如何从远程源中更新/检出单个文件?(原文标题)

571
情境:
  1. 我在本地修改单个文件并运行git addgit commitgit push
  2. 该文件被推送到远程源主库存储库
  3. 我有另一个使用"remote_cache"方法从该远程存储库部署的本地存储库
  4. 现在我不想部署整个应用程序,只想更新/检出该单个文件。
问:Git能否做到这一点?我找不到任何可用的方法,也无法弄清楚。在SVN中,我只需执行svn up file即可。

27
您可能需要考虑将被采纳的答案更改为实际回答您问题的答案。 ;) - steps
10
6年过去了,我相信我们可以安全地假设这不会发生在@steps... - Félix Adriyel Gagnon-Grenier
2
使用Git 2.23(2019年8月),命令是 git restore -s origin/master -- path/to/file。请参见下面的答案 - VonC
9个回答

1245

可以在部署的代码库中完成此操作。

git fetch
git checkout origin/master -- path/to/file

fetch会下载所有最近的更改,但不会将其放入您当前检出的代码(工作区)。

checkout会使用从下载的更改(origin/master)中特定的文件更新工作树。

对于我来说,至少在进行那些小的错别字修复时很有效,这样做只为了更改文件中的一个单词感觉有些奇怪。


1
非常方便,这个方法很好用。在生产环境中更新网站之前,我需要获取一个composer.json文件并运行更新。如果我手动放置composer.json/lock文件,当我进行pull操作时,它会发生冲突,说文件已经存在。通过这种方式,git可以识别文件而不会出现任何问题。 - David
6
这就是我在寻找的答案。 - WestCoastProjects
35
双破折号表示其后面是文件名,目的是为了防止Git将你的文件名误解为分支名称,在存在两个同名文件的情况下特别有用。请注意,此翻译已经尽量保持原意,同时使语言更加通俗易懂。 - Joel Mellon
1
我不确定为什么,但这个解决方案无法在远程上工作。错误:路径规范'upstream/master'未与git知道的任何文件匹配 致命错误:只期望一个引用,但给出了2个 - Alex Barker
1
如果你想要检出文件夹中的所有文件,只需执行git checkout origin/master -- path/to/folder/*(注意最后的*)。 - mcouthon
显示剩余11条评论

85

随着Git 2.23(2019年8月)和新的(仍处于实验阶段)命令git restore的出现,可以看到在 "How to reset all files from working directory but not from staging area?" 中:

git fetch
git restore -s origin/master -- path/to/file

这个想法是:git restore只处理文件,而不像git checkout那样处理文件和分支。
参见"Confused by git checkout":这就是git switch的用处。

codersam在评论中添加了in the comments:

in my case I wanted to get the data from my upstream (from which I forked).
So just changed to:

git restore -s upstream/master -- path/to/file

2
这个命令终于出现了,真是太令人欣慰了...在此之前,那些精通 git 的人都是怎么做的呢?我曾经尝试过恢复整个项目并复制所需的单个文件,但是非常痛苦。 - Mike Wise
这对我有用,但在我的情况下,我想从我的上游获取数据(从中进行了分叉)。所以只需更改为 git restore -s upstream/master -- path/to/file - coderSam
@coderSam 谢谢您的反馈。我已将您的评论包含在答案中以增加可见性。 - VonC
2
从我的测试来看,restore 更好,因为它将文件放在工作区而不是暂存区,而 checkout 则会将文件放在暂存区。 - Zac

81

以下代码对我有效:

git fetch
git checkout <branch from which file needs to be fetched> <filepath> 

1
对于非 origin 远程仓库,执行以下命令:git fetch <remote>; git checkout <remote>/<branch> -- <file> - Hashbrown

24

对我来说,它很简单实用。

git checkout origin/develop file_name.php

这个命令可以工作,只是我需要添加 --git checkout origin/develop -- file_name.php - Franck

19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

2
这是一个适用于通过ssh克隆的存储库的好解决方案,但似乎不支持https:git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x给我一个错误消息:fatal: Operation not supported by protocol. - Alderath
1
结合 tar--to-stdoutgit archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout 很棒。 - Puggan Se

10
你可以做的事情是:
  1. 更新本地 git 仓库:

    git fetch

  2. 在本地创建分支并切换到它:

    git branch pouet && git checkout pouet

  3. 将需要应用的提交应用到此分支:

    git cherry-pick abcdefabcdef

    (abcdefabcdef 是你想要应用的提交的 SHA1)


4
顺便提一句,你的第二步也可以用一个命令完成,即 git checkout -b pouet - Greg Hewgill
5
“pouet” 是这个例子中最好的分支名称。 - Hussard

5
git checkout master
git pull --rebase
git checkout dev
git checkout master ./app/file.py

如果您正在开发dev分支,请在替换文件后合并master分支并推送代码。例如,替换app/file.py文件。

1
我的英语真的很糟糕,希望你能看得懂……这全是机器翻译。 - BillowJiang
1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

2

如果你有修改,可以使用git stash命令,然后切换到主分支(master),拉取最新的更改,将该文件(或整个应用程序)复制到桌面上。然后再切换回原来的分支,使用git stash apply命令回到之前的状态,手动修复修改或替换文件。

这种方法不是很酷,但如果你们无法找到其他解决方案,它绝对可行。


-17

我想我已经找到了一个简单的解决方法。

删除本地仓库中的文件(即您想要从远程服务器更新的文件)

然后执行 git pull

由于文件被删除,所以不会产生冲突


这将删除本地文件所做的所有更改,并拉取所有其他文件,这正是OP不想要的。 - legrojan
不要删除本地分支,而是更新远程分支,这样做会带来很多问题。 - c0der512

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接