如何在我的分支中只存储多个已更改文件中的一个?
当前回答
VonC将文件复制到Git存储库外部的“中间”解决方案的问题是,您会丢失路径信息,这使得稍后将一堆文件复制回来有些麻烦。
A发现使用tar(类似的工具可能会这样做)而不是复制更容易:
tar cvf/tmp/stash.tar路径/to/some/file路径/to/some/other/file(…等)git签出路径/to/some/file-path/to/some/other/file暂存tar xvf/tmp/stash.tar等等(见VonC的“中间”建议)
其他回答
自Git 2.13(2017年第二季度)以来,您可以使用Git stash推送来存储单个文件:
git stash push [-m <message>] [--] [<pathspec>...]
当路径规范被赋予“git stash push”时,新的stash只记录与路径规范匹配的文件的修改状态有关详细信息,请参阅“Stash changes to specific files”。
简化示例:
git stash push path/to/file
此功能的测试用例显示了更多选项:
test_expect_success 'stash with multiple pathspec arguments' '
>foo &&
>bar &&
>extra &&
git add foo bar extra &&
git stash push -- foo bar &&
test_path_is_missing bar &&
test_path_is_missing foo &&
test_path_is_file extra &&
git stash pop &&
test_path_is_file foo &&
test_path_is_file bar &&
test_path_is_file extra
最初的答案(下图,2010年6月)是关于手动选择你想要隐藏的东西。
Casebash注释:
这(隐藏的补丁原始解决方案)很好,但我经常修改很多文件,所以使用补丁很烦人
bukzor的回答(2011年11月投票通过)提出了一个更实际的解决方案,基于git add+git stash--保留索引。去看看并投票给他的答案,这应该是官方的答案(而不是我的答案)。
关于该选项,chhh在评论中指出了另一种工作流:
你应该在这样一个隐藏之后“git-reset-soft”,以获得清晰的分段:为了达到原始状态-这是一个清晰的暂存区,只有一些选择的未暂存修改,可以轻轻地重置索引以获取(而不需要像bukzor那样提交任何操作)。
(原答案2010年6月:手动储存)
然而,git-stash-save补丁可以让你实现你想要的部分存储:
使用--patch,您可以从HEAD和要隐藏的工作树之间的差异中交互选择大块。存储项的构造使其索引状态与存储库的索引状态相同,并且其工作树仅包含您以交互方式选择的更改。然后,所选更改将从工作树回滚。
然而,这将保存完整的索引(这可能不是您想要的,因为它可能包含其他已索引的文件)和部分工作树(看起来可能像您想要隐藏的文件)。
git stash --patch --no-keep-index
可能更合适。
如果--patch不起作用,手动过程可能会:
对于一个或多个文件,中间解决方案是:
将它们复制到Git存储库之外(实际上,eleotlecram提出了一个有趣的替代方案)暂存把它们复制回来git stash#这次,只存储您想要的文件git stash pop stash@{1}#重新应用所有文件修改gitcheckout--afile#在任何本地修改之前将文件重置为HEAD内容
在这个相当繁琐的过程结束时,您将只存储一个或多个文件。
当您尝试在两个分支之间切换时,会出现这种情况。
尝试使用“git add filepath”添加文件。
稍后执行此行
git stash—保留索引
万一你真的打算在使用git stash时丢弃更改(而不是真的使用git stash临时存储),那么你可以使用
git checkout -- <file>
[注]
这个git存储只是分支和执行任务的一个快速而简单的替代方案。
git add . //stage all the files
git reset <pathToFileWillBeStashed> //unstage file which will be stashed
git stash //stash the file(s)
git reset . // unstage all staged files
git stash pop // unstash file(s)
一个复杂的方法是首先提交所有内容:
git add -u
git commit // creates commit with sha-1 A
重置回原始提交,但从新提交中签出_one_file:
git reset --hard HEAD^
git checkout A path/to/the_one_file
现在,您可以存储_one_file:
git stash
通过将提交的内容保存在文件系统中并重置为原始提交来进行清理:
git reset --hard A
git reset --soft HEAD^
是的,有点尴尬。。。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别