首先,根据您的说法,您可能不应该在 Git 上教授课程。本身就已经非常难了,如果是不懂的人教的话我不知道学生会怎么做(我不是要人身攻击你,你可能是好意已经结束了教授这门课是有充分理由的,但我真的认为由熟悉它的人来教授这门课很重要)。
现在,从字面上回答这个问题,要删除没有父级的 Git 提交,您只需确保不再有任何对它的引用
完成后 git 会在一段时间后自动删除其文件;如果您想立即完成它(可能是因为该提交或一系列提交占用了大量空间),您可以使用git gc --prune=all。
因此,在您的情况下,如果这些提交似乎不属于其他分支并且没有任何标签,您只需将您的分支重置到未引用该提交的历史记录中的某个点。
但是如果您想要解决存储库的特定问题:
从你所说的看来,学生所做的合并提交似乎将学生的最后一次提交作为其第一个父级,因此至少最初他将 master 合并到他的分支中。
~ 命令遵循 first 父母,因此当您执行第一个 git reset --hard HEAD~1 时,您将 master 重置为学生的提交行(并且使用以下 2 个命令,您达到了他的第一次提交)。
所以现在在那个存储库中,您可能已经丢失了 您在 master 上的所有其他提交。
如果您有另一个克隆,最好还是回到它,否则您的原始提交行可能仍会被您的 reflog 引用,因此仍然存在。
下面我假设你在你的学生合并后没有对master进行其他提交,从你所说的看来是这样。
您似乎没有使用任何图形存储库浏览器,如果是这样,请键入 gitk --all 并使用它来查看您的分支/引用的确切状态,并按照它来执行您将要执行的操作(您必须每次修改后用 F5 手动刷新)。如果没有图形浏览器,基本上不可能很好地处理 git,但是您尝试将许多选项传递给 git log。
键入 git reflog 并查看它是否列出了您的提交。您需要找到学生的合并提交或之前的提交。
为确保不丢失任何其他内容,请先在您当前所在的位置添加一个标签 (git tag temp1)。
然后,如果您找到了学生的合并提交,请先标记它(git tag temp-studentmerge <sha1-of-the-commit>);代替 放置该提交的(缩写)sha1,当然(它是 git reflog 左侧第一列中列出的内容)。
然后执行git reset --hard temp-studentmerge。更新 gitk;您现在应该再次看到所有提交。
现在您必须重置为正确的合并父级;最简单和最安全的选择是在图形浏览器中查看它的 sha1,然后执行git reset --hard <sha1>。否则,根据您的描述,git reset --hard HEAD^2 应该可以工作。
^<n> 表示法引用第 个父项,而 ~ 仅引用第一个父项。
现在检查一切是否正确,然后删除临时标签(git tag -d temp1 和 git tag -d temp-studentmerge)。
如果您使用 gitk,如果您执行了简单的 F5,您仍然会看到学生的提交,而是执行 Shift-F5(重新加载),您将不再看到它们。
提交对象实际上应该仍然在您的存储库中的某个地方,因为只有当它们超过某个时间时,git才会删除不再引用的对象(我实际上不确定细节)。
如果出于某种原因您现在想删除它们的任何痕迹,您可以使用git gc --prune=all。