如何从多个已更改的文件中仅暂存一个文件

如何从多个已更改的文件中仅暂存一个文件

技术背景

在使用Git进行版本控制时,我们常常会遇到一次修改了多个文件,但只想暂存其中部分文件的情况。Git提供了多种方式来实现这一需求,不同的方法适用于不同的场景和Git版本。

实现步骤

方法一:使用git stash push -p(适用于交互选择)

  1. 运行命令:git stash push -p -m "my commit message"
  2. 对于每个差异块(hunk),会提示以下操作选项:
    • y:暂存此差异块
    • n:不暂存此差异块
    • q:退出,不暂存此差异块及后续差异块
    • a:暂存此差异块及文件中后续所有差异块
    • d:不暂存此差异块及文件中后续所有差异块
    • g:选择要跳转的差异块
    • /:搜索匹配给定正则表达式的差异块
    • j:不决定此差异块,查看下一个未决定的差异块
    • J:不决定此差异块,查看下一个差异块
    • k:不决定此差异块,查看上一个未决定的差异块
    • K:不决定此差异块,查看上一个差异块
    • s:将当前差异块拆分为更小的差异块
    • e:手动编辑当前差异块
    • ?:打印帮助信息

方法二:使用git add + git stash --keep-index

  1. 使用git add添加你想要保留的文件。
  2. 运行git stash --keep-index,这将暂存所有未添加的文件。

方法三:使用git stash push指定文件(Git 2.13及以上版本)

  • 简单示例:git stash push path/to/file
  • 带消息示例:git stash push -m "Some message" "filename"

方法四:使用diffcheckoutapply

  1. 生成差异文件:git diff path/to/dir > stashed.diff
  2. 恢复文件:git checkout path/to/dir
  3. 应用差异:git apply stashed.diff

方法五:临时提交不需要暂存的文件

  1. 临时提交不需要暂存的文件:
1
2
git add a.rb
git commit -m "temp"
  1. 暂存其他文件:git stash save "stash message"
  2. 撤销临时提交:
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"

使用diffcheckoutapply

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可以包含这些文件。

如何从多个已更改的文件中仅暂存一个文件
https://119291.xyz/posts/2025-05-09.how-to-stash-one-file-out-of-multiple-changed-files/
作者
ww
发布于
2025年5月9日
许可协议