有没有可能做git reset --hard --patch
的等价物?(这给了我:fatal: --patch is incompatible with --{hard,mixed,soft}
)。
换句话说,如何做git reset --patch
,但有“未暂存”的更改立即丢弃?(特别是对于新添加的文件-我不希望他们乱丢我的工作目录,因为我已经有相当乱丢其他东西......所以很难找到新的垃圾来手动删除它......)
- edit:* 或者,可能类似于“多个暂存区域”,其中块可以很容易地从一个传递到另一个,就像使用--patch一样?
- edit 2:* 从上面的问题中似乎不清楚,所以我将从下面的评论中复制一个免责声明:* 请注意,我不希望将
git status
输出中的“Changes to be committed”中显示为“new file”的任何文件移动到“Untracked files”。* 对于每个文件,我希望能够明确决定是否要永久保留它们或丢弃它们(即从磁盘中删除)。
换句话说:我试图将一个提交一分为二,但是我有一些“新文件”在里面。其中一些我想移动到提交的“另一半”中。但是我不想从“未跟踪文件”列表中一个一个地添加它们。
- edit 3:* 再次澄清:我有许多“未跟踪的文件”,我不想添加到.gitignore或.git/info/exclude,因为这样或那样的原因。
5条答案
按热度按时间dddzy1tm1#
git reset --hard
旨在使您在基本上任何情况下都处于干净状态:如果你有暂存或未暂存的更改,如果你的索引中有冲突,...在这些情况下,--patch
选项就没有意义了。实际上,
git reset --hard
对于最终用户来说通常不是一个好主意:git stash
不仅会丢弃更改,而且会以不可恢复的方式丢弃更改。与此相反,git stash
会保留更改。它既可以用于“我想暂时将这些更改放在一边,我会很快将它们恢复”,也可以用于“我知道我想永久丢弃这些更改,但我会保留备份以防万一”。正如你已经注意到的,
git stash
有一个--patch
选项,所以这显然是一个很好的解决方案。另一种方法是使用git reset --patch
(没有--hard
)来让你的索引处于你想要的状态,然后使用git stash --keep-index
来让工作树匹配索引。如果更改足够大,您需要担心磁盘空间的使用,或者如果您只是不想在存储列表中添加混乱,则可以运行
git stash drop
来删除存储条目。iyzzxitl2#
发现这个问题是为了做同样的事情,并发现六年后Git现在有了restore命令。
git restore -p -s HEAD
完全符合我的要求,让我交互式地将工作目录的一部分重置为HEAD。它仍然被标记为实验性的,但看起来它至少早在2019年https://stackoverflow.com/a/58003889就被引入了,所以现在应该相当稳定。
khbbv19g3#
我试图将一个提交一分为二,但是我有一些“新文件”在里面。其中一些我想移动到提交的“另一半”中。但是我不想从“未跟踪文件”列表中一个一个地添加它们。
bnlyeluc4#
git reset -p
撤销对 index 的更改,但将其保留在工作树中。它是git add -p
的反义词。如果你想在 * 工作树 * 中进行修改,你可以选择性地将它们复制到stash中,检查stash,最后删除stash:
voase2hg5#
我找到了一个解决方案:将repo克隆到一个临时目录,在那里我可以
git reset -p
和git add .
来编辑提交,而不会被额外的未跟踪文件所困扰。但是也有明显的缺点,包括钩子不能自动克隆,任何硬编码的路径都不能工作(包括PATH,GOPATH,IDE中的项目等)。