惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
L
LangChain Blog
WordPress大学
WordPress大学
V
V2EX
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
Docker
Recent Announcements
Recent Announcements
GbyAI
GbyAI
博客园 - 叶小钗
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
雷峰网
雷峰网
The GitHub Blog
The GitHub Blog

PixelNest

会议是效率的杀手 国庆出游记录 对居家办公的一些想法 2022 春节 《搏击俱乐部》的结局 纪念 PAI 头一回达到 100 卡片笔记法 《刑法学讲义》的部分摘录 迁移博客 《UNIX 传奇》摘录 就地过年 一点记录:docker-compose 编排不同项目间的网络 近期读的几本书 办新身份证 我的高考成绩 推荐 2020 年上半年的 8 部影视作品 ChromeOS 开发者模式 终于下单了《守望者》 联通来电管家服务 一些实用的 bash 代码片段 关于 鸟枪换炮 《架构整洁之道》摘录 惨淡的星球大战 旧笔记本电脑 if...then... 命令行检测 SSL 证书过期时间 《程序员的职业素养》读书笔记 2019 国庆假期 在 Ubuntu 里按空格键预览
git 获取其他分支的单个文件或目录
2020-08-03 · via PixelNest

比如当前在 master 分支,想临时把项目中的某个文件换成 dev 分支的对应文件或目录,或者某一个 commit 里面的对应文件和目录,其他目录和文件保持不变。

git checkout

对于 git2.23 之前的版本,可以使用 git checkout 命令实现上述需求。

git checkout dev -- dir2/f2.txt

复制 dev 分支的 dir2/f2.txt 文件到当前分支。

命令中的 dev 是分支名,也可以是任意一次 commit 的 hash,或者其他 tree-ish

在 git 的文档里,git checkout 的功能描述:「Switch branches or restore working tree files」。它做的事情太多了,所以在 git2.23 以及之后的版本,它被「拆分」了:切换分支的工作由 git switch 命令来做,恢复文件的工作由 git restore 来做。

git restore

git restore -s dev -- dir2/f2.txt

跟上面一样,-s 的参数值可以是分支名,commit hash 或其他任何 tree-ish 值。

跟上面的命令不同的地方在于,执行完这个命令之后,此时在 master 分支,dir/f2.txt 文件的还没有处于「暂存」(staged)状态。

On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
	modified:   dir2/f2.txt

no changes added to commit (use "git add" and/or "git commit -a")

而使用上述 git checkout dev -- dir2/f2.txt 命令之后,dir2/f2.txt 是已暂存、待提交的状态。

On branch master
Changes to be committed:
  (use "git restore --staged ..." to unstage)
	modified:   dir2/f2.txt

一般来说,前者(不处于暂存状态)是我想要的结果。如果要 git restore -s dev -- dir2/f2.txtgit checkout dev -- dir2/f2.txt 一样的效果,可以给 git restore 加上 --staged --worktree 参数,可以简写为 -SW

git restore -s dev -SW dir2/f2.txt