当强制推入github时丢失所有提交

时间:2017-08-27 18:13:22

标签: git github git-bash

最近我在分叉回购中创建了一个PR并添加了一些提交。后来我不小心从git bash删除了分支(branch出现在我的分叉回购中)。所以我重新创建了一个具有相同名称的分支,在那里,我尝试推送新的提交。但是它最初拒绝了提交,因此我强制推送提交,但这删除了github中PR的所有先前提交。

我不知道这里发生了什么。还有可能找回所有丢失的提交吗?

2 个答案:

答案 0 :(得分:2)

在您做任何其他事情之前 - 复制一份本地仓库。

使用git fsck --lost-found(或git fsck --dangling)查找丢失的提交(悬挂SHA),然后git reflog将其与您的提交评论相匹配,以便识别它们。

注意:根据发生的情况,您可能无法使用原始“reflog”命令获取提交条目(尽管可能有一个参数可以使用reflog执行此操作)。相反,正如我在底部的更新中提到的,您可以使用git log --walk-reflogs --oneline --decorate按日期/时间顺序列出所有提交的日志。

如果/当您发现丢失的提交(忘记旧/丢失的分支名称)时,您可以将该SHA直接合并到新分支中,或者您可以检查丢失的提交(或从中创建新的分支)。

使用git log --graph --all --online --decorate(或类似)查看您的回购后检查丢失提交的方式,看看它是否符合您的预期。

注意:如果你做了一个git清理你可能会失去你的“悬空提交”,但如果你没有做任何git清理,那么没有理由他们应该丢失。

E.g:

  1. 回收数据丢失:
  2. D:\software\sandpit\branchclonetest > git log --graph --oneline --all --decorate * 77d69c7 (HEAD -> fromNewBranch, origin/master, origin/fromNewBranch, origin/HEAD) new file * 88181c4 (origin/new_branch) new file * 175d1e1 (origin/test_branch_1) file for merge back to master * 5d5b028 file added in branch * 777984b yet another file * e0652e8 (origin/logoff) new test files added

    1. 寻找丢失/悬挂的提交
    2. D:\software\sandpit\branchclonetest > git fsck --lost-found Checking object directories: 100% (256/256), done. dangling commit 92cacfdb6265075b8fae5fd63b21219cf91ea0ec <-- WANT THIS ONE dangling commit 1ad608bd48fc8bdedd186d05cc486974d6890265 dangling commit 59622d01426d876aec3a7e9265d52648a66e13e5

      1. Checkout丢失提交92cacf ...
      2. D:\software\sandpit\branchclonetest > git checkout 92cacfdb6265075b8fae5fd63b21219cf91ea0ec Note: checking out '92cacfdb6265075b8fae5fd63b21219cf91ea0ec'... etc...

        1. 再次检查回购图,看看发生了什么:
        2. D:\software\sandpit\branchclonetest > git log --graph --oneline --all --decorate * 77d69c7 (origin/master, origin/fromNewBranch, origin/HEAD, fromNewBranch) new file * 88181c4 (origin/new_branch) new file * 175d1e1 (origin/test_branch_1) file for merge back to master * 5d5b028 file added in branch * 777984b yet another file | * 92cacfd (HEAD) test <--- COMMIT FOUND HERE |/ * e0652e8 (origin/logoff) new test files added

          注意 - 不要执行git gc(清理)或其他修剪类型操作,因为这样可以真正删除悬空/不可达提交...

          <强>更新

          在看别的东西时记得这个,所以我想我会把它添加到这篇文章中。您可以使用git log的“--walk-reflogs”或“-g”选项记录所有reflog。

          这将显示包括悬空提交在内的所有内容,因为它不会通过分支/祖先遍历提交 - 它按日期顺序遍历提交(最新的顶部)。

          因此,要查看您可以使用git log --walk-reflogs的所有提交,或者您希望信息更加简洁:git log --walk-reflogs --oneline --decorate(添加装饰只是为了使与提交相关的任何标记/分支也是示出)。

答案 1 :(得分:1)

尝试git reflog origin/name_of_your_branch找到您的旧提交。一定是在那里。

如果你找不到,那是因为你做了git push --force这是真的不好的做法。您必须现在使用git push --force-with-lease来防止此类问题。

如果不是,则必须在另一个答案中使用git fsck