如何把另一个分支上的单个文件复制到当前分支
从别的分支拿单个文件:git checkout <源分支> -- <文件路径>(Git 2.23+ 用 git restore --source=<源分支> <路径>),文件会以该分支的版本覆盖工作区并加入暂存区,提交即可。
一条命令:git checkout 源分支名 -- 文件路径(新语法 git restore --source=源分支名 文件路径)。文件会以源分支上的版本覆盖当前工作区并自动进入暂存区,检查后 git commit 即可。只想看内容不想覆盖的话,用 git show 分支:路径 输出。
操作步骤
git checkout main # 1. 确认站在目标分支
git checkout feature-x -- src/utils/helper.js # 2. 从 feature-x 拿单个文件
# 或新语法
git restore --source=feature-x src/utils/helper.js
git status # 3. 确认暂存区变化
git commit -m "从 feature-x 引入 helper.js"
更多用法
# 拿整个目录
git checkout feature-x -- src/components/
# 从某个历史提交拿(不限于分支)
git checkout a1b2c3d -- src/app.js
# 只看内容不落地
git show feature-x:src/app.js
注意
- 这是覆盖式复制:当前分支该文件上的本地改动会被替换,先确认或先 stash;
- 它不会保留源分支上的提交历史——只是一个普通的新提交;
- 需要"把那个文件在两边的改动合并"时,这条路不适用,得手工合并或 cherry-pick 相关提交。
常见问题(FAQ)
Q:能只拿文件的一部分改动吗?
可以:git checkout -p feature-x -- 文件路径 进入交互模式逐块选择(与 add -p 相同操作)。
Q:checkout 之后后悔了?
git restore --staged --worktree 文件路径 丢弃拿回的内容,恢复到之前状态。
Q:源文件在远程分支上,本地没有?
git fetch 后用 git checkout origin/feature-x -- 路径 直接从远程跟踪引用拿。