在进行“git隐藏”时保留更改`

在进行“git隐藏”时保留更改`,git,Git,有没有什么方法可以让我运行git stash让它创建我的文件的一个存储库,但也保留它们,以便我可以继续编辑它们 我这样做的动机是,我想为我正在做的一些工作创建一个临时快照,这样,如果我把事情搞砸了,我就可以重新开始。然而,我的代码目前并没有处于我想要实际提交它的状态,如果我的测试如我所期望的那样工作,我想扔掉旧版本,而不让它出现在我的历史记录中 显然,我可以只复制我的repo所在的目录,然后在其中一个目录中工作,但是有更好的方法吗?据我所知,没有一种方法可以用一个命令git stash实现这一点

有没有什么方法可以让我运行
git stash
让它创建我的文件的一个存储库,但也保留它们,以便我可以继续编辑它们

我这样做的动机是,我想为我正在做的一些工作创建一个临时快照,这样,如果我把事情搞砸了,我就可以重新开始。然而,我的代码目前并没有处于我想要实际提交它的状态,如果我的测试如我所期望的那样工作,我想扔掉旧版本,而不让它出现在我的历史记录中

显然,我可以只复制我的repo所在的目录,然后在其中一个目录中工作,但是有更好的方法吗?

据我所知,没有一种方法可以用一个命令
git stash
实现这一点,但是你可以用两个
git stash
来实现

要运行的命令包括:

git stash
git stash apply

第一种方法是将您的局部更改推送到存储库,从而将它们从头部移除。第二种方法从堆栈中获取更改,并将其放回头部,但也会在您的存储堆栈中保留一份副本。

我认为在这种情况下,更好的解决方案是创建主题分支

在Git中,分支非常便宜

如果您有要“隐藏”的工作,稍后再回来,请执行以下操作:

git checkout -b myStashBranch
git add .
git commit -m "savepoint when I foo..."
然后,只需切换回您当前所在的分支:

git checkout -
继续完成手头的任务

如果你想扔掉刚刚保存的“隐藏”工作,那么:

git branch -D myStashBranch

对于您正在讨论的工作流类型,我认为最好创建一个临时主题分支来使用

git checkout -b couldgowrong
如果您喜欢在完成更改后进行更改,那么只需将主题分支重新设置为
主分支,然后删除分支;
rebase
将保持历史记录的干净(即没有双亲合并)

如果您不喜欢所做的更改,只需跳过
重新设置基址
并删除主题分支。

您有两个选择:

git stash store -m "WIP on $(git rev-parse --abbrev-ref HEAD): $(git log -1 --format="%h %s")" $(git stash create)

两者都有利弊。第一种方法根本不会影响工作目录的状态,但是非常冗长(尽管将其转换为别名可以缓解这种情况)。第二个更简单,但这意味着所有更改都将分阶段进行(这可能是需要的,也可能不是需要的)

这些措施的好处是多方面的

git stash
git stash apply
所有文件都需要修改两次。如果存在大量文件,或者如果您使用的IDE可能在每次文件更改后都尝试重建,则这可能会导致速度问题。如果这不是一个问题,那么一定要使用它

如果Git能够提供

git stash --keep-working-dir
如果你要有规律地做这些事情,你应该做一个别名

试试这个,它救了我

如果在“JetBrains”IDE(IntelliJ、PyCharm等)中使用

右键单击项目的主父文件夹,选择“本地历史记录”,然后选择“显示历史记录”:


现在,您可以在右侧的新窗口中根据左侧的时间查看项目中始终存在的所有文件,当然可以使它们恢复或查看差异。

这听起来像是您试图伪造提交。为什么你要假装一次承诺而不是仅仅做一次呢?@BradMace如果他想做备份,但又不想用毫无意义的承诺来扰乱他的承诺历史呢?@JosephK.Strauss我不是想说他错了,只是想了解他的目标是什么。(我想他在5分钟的编辑窗口中编辑了更多的信息)。在这种情况下,我的建议是先进行提交,然后在推送到主repo之前将其压扁。您可以通过执行
git stash save
,然后执行
git stash apply
,在一个命令中创建一个git别名来完成此操作。如果您担心“提交失败”,我想补充一下(也就是说,在代码未编译或功能不全的情况下进行提交),您可以在合并回
master
之前,或在重定基址到
master
时,始终挤压或重新排序提交。
git stash
git stash apply
git stash --keep-working-dir