git - 在 github 中强制推送时丢失所有提交

标签 git github git-bash

最近我在一个 fork 的仓库中创建了一个 PR 并添加了一些提交。后来我不小心从 git bash 中删除了分支(branch 出现在我的 fork repo 中)。所以我重新创建了一个同名的分支,并在其中尝试推送新的提交。但是它一开始拒绝了提交,所以我强行推送了提交,但这从 github 中的 PR 中删除了所有以前的提交。

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

最佳答案

在你做任何其他事情之前 - 复制你的本地存储库。

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

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

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

使用 git log --graph --all --oneline --decorate (或类似)以查看您的 repo 在您检查丢失的提交后的样子,看看这是否符合您的预期。

注意:如果您进行了 git clean up,您可能会丢失“悬空提交”,但如果您没有进行任何 git clean up,则没有理由丢失它们。

例如:

  1. 丢失数据的 repo :

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. 寻找丢失/悬空的提交

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...

D:\software\sandpit\branchclonetest > git checkout 92cacfdb6265075b8fae5fd63b21219cf91ea0ec Note: checking out '92cacfdb6265075b8fae5fd63b21219cf91ea0ec'... etc...

  1. 再次检查 repo 图表以查看发生了什么:

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 (添加装饰只是为了显示与提交相关的任何标签/分支)。

关于git - 在 github 中强制推送时丢失所有提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907952/

相关文章:

git - 使用Gitlab的API,如何在分支之间切换?

php - "git pull"外部世界不工作

git - 服务器 Git 用户名在 GitHub.com 上的什么位置显示?

git - 搞乱了我本地的 git 分支。我如何恢复到干净工作的主分支

git - 如何将我当前的更改提交到 Git 中的不同分支

.net - 我怎么能忽略 git 存储库中的 bin 和 obj 文件夹?

git - GitHub 消息 : push declined due to email privacy restrictions 的含义

python - 在heroku中部署一些更改时无法编译python(权限被拒绝!)

windows - 如何像在 Linux 中一样在 git bash 中通过向上/向下翻页启用历史搜索?

Git 庆典错误 : Could not fork child process: There are no available terminals (-1)