如何从多个已更改的文件中仅暂存一个文件
技术背景
在使用Git进行版本控制时,我们常常会遇到一次修改了多个文件,但只想暂存其中部分文件的情况。Git提供了多种方式来实现这一需求,不同的方法适用于不同的场景和Git版本。
实现步骤
方法一:使用git stash push -p
(适用于交互选择)
- 运行命令:
git stash push -p -m "my commit message"
- 对于每个差异块(hunk),会提示以下操作选项:
y
:暂存此差异块n
:不暂存此差异块q
:退出,不暂存此差异块及后续差异块a
:暂存此差异块及文件中后续所有差异块d
:不暂存此差异块及文件中后续所有差异块g
:选择要跳转的差异块/
:搜索匹配给定正则表达式的差异块j
:不决定此差异块,查看下一个未决定的差异块J
:不决定此差异块,查看下一个差异块k
:不决定此差异块,查看上一个未决定的差异块K
:不决定此差异块,查看上一个差异块s
:将当前差异块拆分为更小的差异块e
:手动编辑当前差异块?
:打印帮助信息
方法二:使用git add
+ git stash --keep-index
- 使用
git add
添加你想要保留的文件。 - 运行
git stash --keep-index
,这将暂存所有未添加的文件。
方法三:使用git stash push
指定文件(Git 2.13及以上版本)
- 简单示例:
git stash push path/to/file
- 带消息示例:
git stash push -m "Some message" "filename"
方法四:使用diff
、checkout
和apply
- 生成差异文件:
git diff path/to/dir > stashed.diff
- 恢复文件:
git checkout path/to/dir
- 应用差异:
git apply stashed.diff
方法五:临时提交不需要暂存的文件
- 临时提交不需要暂存的文件:
1 2
| git add a.rb git commit -m "temp"
|
- 暂存其他文件:
git stash save "stash message"
- 撤销临时提交:
1 2
| git reset --soft HEAD^ git reset
|
方法六:使用新的--staged
选项(Git >= 2.35)
1 2
| git add <some-files> git stash save --staged 'my stash'
|
核心代码
使用git stash push -p
1
| git stash push -p -m "my commit message"
|
使用git add
+ git stash --keep-index
1 2
| git add <files you want to keep> git stash --keep-index
|
使用git stash push
指定文件
1
| git stash push -m "Some message" "filename"
|
使用diff
、checkout
和apply
1 2 3
| git diff path/to/dir > stashed.diff git checkout path/to/dir git apply stashed.diff
|
临时提交不需要暂存的文件
1 2 3 4 5
| git add a.rb git commit -m "temp" git stash save "stash message" git reset --soft HEAD^ git reset
|
使用新的--staged
选项
1 2
| git add <some-files> git stash save --staged 'my stash'
|
最佳实践
- 如果需要交互选择暂存内容,推荐使用
git stash push -p
。 - 对于Git 2.13及以上版本,直接使用
git stash push
指定文件是最简单的方法。 - 当只想暂存已暂存的文件时,使用新的
--staged
选项。
常见问题
- 合并冲突:使用
git stash --keep-index
可能会导致后续弹出暂存时出现合并冲突,需要手动解决。 - 文件路径丢失:将文件复制到Git仓库外进行暂存时,会丢失路径信息,可使用
tar
命令代替复制。 - 未跟踪文件:如果有未跟踪的文件,使用
git stash push --include-untracked
可以包含这些文件。