我显然搞砸了,想把这作为一个学习的经验。
自从上次推送以来,我已经修改了很多代码(我知道这是一个糟糕的做法,我也学到了很多),但这就是我现在的情况。我尝试分组提交,而不是一次提交所有内容。所以我提交了第一个代码文件/工作单元,这很好。当我做第二个的时候,我忘了表演。已输入我的消息并提交(哎呀!每一次修改都是这一次提交的一部分!)。在第二次提交时进行了恢复,但我的本地代码没有恢复到提交之前的状态。
我看了看这里然后重置到第一次成功提交...但其他文件中的更改仍然全部丢失。
尝试重置为HEAD~1,如此处所述,但对所有文件的更改仍未显示。
有没有办法让整个解决方案(所有的更改)回到这个问题之前的位置???
更新...我只是做了一个重置到第二次提交(一个与一切),它得到了我的代码回来...我可能只是把它吸起来,把所有的文件放在一个提交中(反正我是唯一的开发人员),但我不喜欢这样做(强迫症!)
2条答案
按热度按时间tzdcorbm1#
假设你的历史现在看起来是这样的
然后你可以这样做:
现在是这样的:
现在这样做:
现在是这样的
你在CCC中所做的一切都将在你的工作树周围准备好,就像CCC根本没有发生一样。
现在,作为我的最后一个技巧,去看看如何使用
git reset --soft
和git commit --amend
,因为它们是主要的时间(和生命)节省者。z9gpfhce2#
我在这里的第一个建议是不要急于使用有害的命令,特别是从一开始就使用
reset --hard
。在Git中,真正可以释放数据的情况非常罕见,但似乎大多数人在努力实现给定目标时都会直接关注它们。当你忘记在最后一次提交中添加内容时(经常发生),只需添加此内容,然后使用
git commit --amend
。这允许您修改此提交,这实际上会将您带回到编辑时,其中包含更新的索引和您记录的最后一条消息。这使您能够修改此消息和/或提交的内容。Git在这里实际上做的是生成另一个提交来替换前一个。如果你在之前的提交中忘记了一些东西,这不是到目前为止,但也不是最后一次,最简单的方法是使用
rebase -i
命令,与squash
选项相关联。备注:
rebase -i
可能经常会被理解为重写一个分支。不完全是这样就像常规的变基一样,* 交互式 * 变基应该将分支“变基”到另一个起点,但是-i
提供的工具非常有用,开发人员经常“变基到同一个地方”,只是为了利用这些副作用。因此,为了重建包含您错过的内容的历史记录,您只需要:
git tag imessedituphere
,这样如果这个过程失败了,你可以很容易地回到这一点;git status
验证存储库是否干净;git rebase -i <some commit id on the branch before things went wrong>
;row
(省略了stuff),将其插入到引用提交的行之后,该提交应该包含该stuff;edit
关键字(省略了stuff)替换为squash
;squash
实际上会将你的提交与前一个提交合并,其作用方式与--amend
大致相同。然后你会进入一个编辑器页面,它会同时显示原始提交的消息和压缩后的消息,连接起来,这将允许你只保留真正相关的内容(你甚至可以利用这一步来执行额外的修改,但我们现在先把这一点放在一边)。