在我的仓库中披露一些丢失的git提交

时间:2016-07-17 01:05:33

标签: git github

我的项目文件夹目前是最新的(r41)。

我记得我试图为修订版38提交一些文件以进行重构但是我在代码中做了一些其他更改之后不得不取消未发布(尚未推送)的提交并最终致力于使其成为r38 (我使用git -reset soft HEAD~1)。

我继续致力于r41的项目完成。现在,我想查看一些代码,并在my repo中找不到旧的提交(r36,r37)。

reflog result

过去我学到了一些关于Git的知识,但经过几个月的高度关注开发,我似乎忘记了一些Github的知识,显然想用Github戏剧缩短它(太多的命令和解释,也没有创造混淆,他们确实花费时间来完全理解和清晰,不会输入错误的命令。)

切入追逐,我目前的情况我不想创建任何分支。我想保持同一个主人,并在我的回购中显示r36,r37。 我应该输入什么git命令?请简单解释一下。非常感谢。

1 个答案:

答案 0 :(得分:2)

查看reflog,我认为在r37(两次)和r39之后执行了与git reset HEAD~1类似的命令。这可以解释为什么master分支中缺少提交的原因(git reset --hard HEAD~1会将HEAD指针移动到前一个提交,从而有效地删除当前分支的最后一个提交)(显然,那个命令以前用于修改r34)。某些源代码可能会丢失,也可能不会丢失(取决于--hard中是否指定了git reset

对未来的建议:

  • 当您要清理工作区时,请使用git reset --hard或更好的git clean - 无需指定修订版;
  • 如果要修复未发布的提交,请使用git commit --amendgit rebase -i;

现在,问题是对应于r36,r37和r39的提交不是本地存储库上master分支的一部分。但是,除非你非常不走运(或运行一个可以修剪悬空提交的git gc),否则提交数据应该仍然存在。

我认为(请在执行互联网陌生人提供的任何命令之前备份您的git存储库)git cherry-pick应该通过重新引入相应的代码(在新创建的提交对象中)来解决您的问题。

因此,以下命令应引入新的提交,这将与缺少的修订相匹配:

git cherry-pick 52b140c 6fca0fa ca7ee4f

之后你可以将它推送到github - 带有正确消息的提交将出现在master分支的末尾。

编辑:我已经在假设--hard重置已完成的情况下编写了上一个答案。但是,如果重置是软的,那么这意味着已经完成了这些提交的更改。在这种情况下,恢复提交只是在历史中重新引入这些提交的一种方式 - 这意味着将有一个历史重写,如果存储库已经被其他人拉动,这可能是一个很大的麻烦。

如果您可以进行历史记录重写,那么,在提交任何未完成的更改后,丢弃樱桃选择(例如通过运行git reset --hard 60c067e,或使用我告诉您的备份),您可以运行以下命令,根据先前存在的提交重新生成现有代码:

# This command will reintegrate r39
git rebase 6fca0fa

# This command will reintegrate r36 and r37
git rebase ca7ee4f

之后,您将能够推送到github,但您必须使用--force选项(因为一些现有的已发布的提交将被删除)