“GitHub Desktop”Mac应用在主视图的提交区域中有一个“撤消”按钮。
单击它似乎从存储库中删除最近的提交而不要求确认。虽然本地更改仍然可用,但撤消过去当前不在本地的任何内容似乎会从存储库历史记录中完全删除它。这是演示存储库的日志。在几次提交之后,在按下“撤消”之前,它看起来像这样:
- f6e4436(master)初始提交。
- a3857ad添加了示例文件。
- cf17c3b添加了关键内容。
- 35f1c76(HEAD - > dev)意外删除关键行。
此时关键行不再是本地或最后一次提交。它仍然可以通过“cf17c3b”哈希获得。
单击撤消一次会产生以下结果:
- f6e4436(master)初始提交。
- a3857ad添加了示例文件。
- cf17c3b(HEAD - > dev)添加了关键内容。
两点之后:
- f6e4436(master)初始提交。
- a3857ad(HEAD - > dev)添加了示例文件。
最后,第三次按下“撤消”按钮,将回购状态恢复原状:
- f6e4436(HEAD - > dev,master)初始提交。
在最后两次“撤消”点击后,“cf17c3b”提交不再可访问(即我意外删除的关键行似乎已被完全删除)。
我没有在应用程序中看到“重做”“撤消”所做的更改。这是非常令人惊讶的,因为该按钮不需要确认它可能会永久删除代码。我的问题是:
是否可以从应用内部“重做”以恢复“撤消”删除的提交?
如果通过应用程序无法通过命令行可以吗?
答案 0 :(得分:6)
我不知道通过应用程序,但使用git reflog
您可以找到HEAD
所在的历史记录,然后将当前分支与该提交合并以恢复它(和所有以前的提交)。我的猜测是该应用程序使用git reset
撤消提交,因此您的reflog可能如下所示:
0ba8580 HEAD@{0}: reset: moving to head~
1451518 HEAD@{1}: reset: moving to head~
79b5909 HEAD@{2}: reset: moving to head~
a28c206 HEAD@{3}: checkout: moving from 4de17de8c1a89f17db894150144e58f8b0b50f6c to master
4de17de HEAD@{4}: checkout: moving from master to head~4
a28c206 HEAD@{5}: checkout: moving from 5005e7d017b15cf6d725ca01ac586e566338fa86 to master
最近的行动是列表中的第一个。您想要做的是在要撤消的reset
之后与行合并。例如,在这种情况下,您可以尝试git merge HEAD@{3}
。如果要在合并之前检查提交,请执行git show HEAD@{3}
。