相当于:git reset --hard --patch?

3zwtqj6y  于 2023-04-19  发布在  Git
关注(0)|答案(5)|浏览(165)

有没有可能做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,因为这样或那样的原因。
dddzy1tm

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来删除存储条目。

iyzzxitl

iyzzxitl2#

发现这个问题是为了做同样的事情,并发现六年后Git现在有了restore命令。
git restore -p -s HEAD完全符合我的要求,让我交互式地将工作目录的一部分重置为HEAD。
它仍然被标记为实验性的,但看起来它至少早在2019年https://stackoverflow.com/a/58003889就被引入了,所以现在应该相当稳定。

khbbv19g

khbbv19g3#

我试图将一个提交一分为二,但是我有一些“新文件”在里面。其中一些我想移动到提交的“另一半”中。但是我不想从“未跟踪文件”列表中一个一个地添加它们。

now=`git write-tree`       # snapshot current state w/o bothering with a commit
git checkout --patch @     # undo whatever needs undoing
git commit                 # and that's the first commit
git read-tree -um $now     # now the original state's back in index and work tree
bnlyeluc

bnlyeluc4#

git reset -p撤销对 index 的更改,但将其保留在工作树中。它是git add -p的反义词。
如果你想在 * 工作树 * 中进行修改,你可以选择性地将它们复制到stash中,检查stash,最后删除stash:

git stash -p        # select hunks
git stash list -p   # review you don't shoot at foot, rollback with "git stash pop"
git stash drop      # forget the junk you wanted to remove
voase2hg

voase2hg5#

我找到了一个解决方案:将repo克隆到一个临时目录,在那里我可以git reset -pgit add .来编辑提交,而不会被额外的未跟踪文件所困扰。
但是也有明显的缺点,包括钩子不能自动克隆,任何硬编码的路径都不能工作(包括PATH,GOPATH,IDE中的项目等)。

相关问题