最近我在分叉回购中创建了一个PR并添加了一些提交。后来我不小心从git bash
删除了分支(branch
出现在我的分叉回购中)。所以我重新创建了一个具有相同名称的分支,在那里,我尝试推送新的提交。但是它最初拒绝了提交,因此我强制推送提交,但这删除了github
中PR的所有先前提交。
我不知道这里发生了什么。还有可能找回所有丢失的提交吗?
答案 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:
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
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
D:\software\sandpit\branchclonetest > git checkout 92cacfdb6265075b8fae5fd63b21219cf91ea0ec
Note: checking out '92cacfdb6265075b8fae5fd63b21219cf91ea0ec'... etc...
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
。