如何在 git reset --hard 后存储一些本地更改

7

我有些本地修改(不是在单独的文件中,所以.gitignore不起作用),我不想提交它们。
有时我会执行git reset --hard来清除偶尔出现的更改,但显然我也会失去我想要保留的有用更改。

如何保留我的有用更改?

3个回答

6

是的,我知道git stash,但我不想每次都隐藏我的更改。 - freemanoid
6
好的,让我们假设你想象中的git preserve-these-and-these-changes命令确实存在;那么每次你想要保存一些内容以在git reset --hard后恢复,你都需要调用这个虚构的命令,然后再调用另一个命令来“撤消”它设置在选定文件上的保留状态。那么这与git stash / git stash pop有何不同? - kostix

5

您也可以尝试以下方法:

git update-index --skip-worktree -- file
# to cancel it:
git update-index --no-skip-worktree -- file

它应该能抵御git reset --hard。(请参阅此答案关于 '--' 双短横线的用法)
请查看这篇博客文章
  • 看起来skip-worktree非常努力地保护您的本地数据。但是,如果安全的话,它并不会阻止您获取上游更改。另外,git不会在拉取时重置标志。但忽略“reset --hard”命令可能会给开发人员带来不愉快的惊喜。
  • assume-unchanged标记可能会在拉取操作中丢失,并且这些文件内部的本地更改似乎对git并不重要。
    假设未改变则认为开发者不应更改文件。如果文件已更改,则该更改无关紧要。此标志旨在提高像SDK这样的不更改文件夹的性能。但是,如果承诺被打破并且文件实际上已更改,则git将还原该标志以反映现实情况。通常在一般不应更改的文件夹中具有一些不一致的标志可能是可以接受的。
另一方面,skip-worktree很有用,当你指示git永远不要触碰特定文件时。这对于已跟踪的配置文件非常有用。上游主仓库托管了一些生产就绪的配置,但您想更改配置中的某些设置,以便能够进行一些本地测试。而且,您不希望意外检查此类文件中的更改以影响生产配置。在这种情况下,skip-worktree非常合适。

1
@freemanoid 只需执行 git update-index --no-skip-worktree -- aFile 即可。 - VonC
嗯,我在查看手册时没有找到这个,但它确实存在。所以 git update-index --no-skip-worktree my_file 是可行的。 - freemanoid
@freemanoid 很好。我已经将该命令添加到答案中以增加可见性。 - VonC
@MattGreer 是的,我做到了。该睡觉了 ;) - VonC

0
如果你不想提交这些更改,但又需要在本地使用它们,考虑为本地更改创建并提交一个脚本或补丁文件。然后,您可以保留和记录您的更改,并在硬重置后轻松应用它们。
如果您有针对特定环境的更改,则将它们外部化到配置文件中可能是值得的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接