最近我在一个 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,则没有理由丢失它们。
例如:
- 丢失数据的 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
- 寻找丢失/悬空的提交
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
- checkout 丢失提交 92cacf...
D:\software\sandpit\branchclonetest > git checkout 92cacfdb6265075b8fae5fd63b21219cf91ea0ec
Note: checking out '92cacfdb6265075b8fae5fd63b21219cf91ea0ec'... etc...
- 再次检查 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/