恢复丢失的提交到分离的头

Resurrect lost commits to deattached head

我定期提交我的进步,今天想推动它。 由于某些原因,我收到一个错误消息,它有一个分离的头和 (deny updating a hidden ref)。现在,在执行各种步骤以重新连接它之后,我的工作就消失了。我无法恢复它,甚至无法找到这些提交。我经常承诺但没有推动。现在我有点不知所措了。

这是历史,我以为我在分支 Feature_SaveAs_Unfinished

 2004  git commit -am "Removing old logs"
 2005  git push
 2006  git pull origin Feature_SaveAs_Unfinished 
 2007  git push origin origin/Feature_SaveAs_Unfinished 

None 其中由于头部分离而起作用。

 2007  git push origin origin/Feature_SaveAs_Unfinished 
 2008  git push --mirror
 2009  git pull
 2010  git pull origin Feature_SaveAs_Unfinished 
 2011  git push origin Feature_SaveAs_Unfinished 
 2012  git status
 2013  git checkout origin/Feature_SaveAs_Unfinished

我收到一条消息,如果我想保存我的工作,我应该为它创建一个额外的分支。

 2014  git branch Feature_SaveAs_040221_Automerge
 2015  git checkout origin/Feature_SaveAs_Unfinished 
 2016  git status
 2017  git pull
 2018  git pull origin Feature_SaveAs_Unfinished 
 2019  git checkout origin/Feature_SaveAs_Unfinished 

此时我在 SO 上查找了一些解决方案: 接下来的步骤是根据 post:

 2021  git branch temp
 2022  git checkout temp
 2023  git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
 2024  git diff master temp
 2025  git diff origin/master temp
 2026  git branch -f master temp
 2027  git checkout master
 2028  git status
 2029  git branch -d temp

我正试图回到我工作的分支,因为我不在 master 上。

 2030  git status
 2031  git branch -f Feature_SaveAs_040221_Automerge master
 2032  git checkout Feature_SaveAs_040221_Automerge 
 2033  git status
 2034  git pull

此时我找不到我的作品了。我更改的文件是一些非常旧的版本。 (可能来自主人)。 我不知道如何回复他们。

我知道我最近在调试消息中使用了 ,所以我检查了一下。

$ rgrep -rni ☆
Binary file .git/objects/98/9574bda27235aa00dd6ad2846512c69a87a2a3 matches
Binary file .git/objects/9d/c18eb8bba4d381ad0a96c782fec57928dc92d2 matches
Binary file .git/objects/pack/pack-ca6560ce8bd83b69093cea6fbd492ff9ef1a54c0.pack matches

这个是另外一回事:

$ ll 9574bda27235aa00dd6ad2846512c69a87a2a3 
-r--r--r-- 1 qohelet qohelet 2244035 Nov  3 17:38 9574bda27235aa00dd6ad2846512c69a87a2a3

但仅此而已:

$ ll c18eb8bba4d381ad0a96c782fec57928dc92d2
-r--r--r-- 1 qohelet qohelet 3581541 Feb  2 16:51 c18eb8bba4d381ad0a96c782fec57928dc92d2

我使用了 gitk 等工具来显示最后的提交。我找不到任何。即使是当前创建的分支 Feature_SaveAs_040221_Automerge 也指向几周前完成的提交(即使我半小时前创建了分支)。

怎么办?我将如何获得我的更改并提交到分离的提交?

编辑 (1):

$ git reflog 
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{0}: checkout: moving from Feature_SaveAs_040221_Automerge to Feature_SaveAs_Unfinished
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{1}: reset: moving to HEAD
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{2}: checkout: moving from Feature_SaveAs_Unfinished to Feature_SaveAs_040221_Automerge
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{3}: checkout: moving from Feature_SaveAs_040221_Automerge to Feature_SaveAs_Unfinished
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{4}: checkout: moving from master to Feature_SaveAs_040221_Automerge
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{5}: checkout: moving from Feature_SaveAs_040221_Automerge to master
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{6}: checkout: moving from Feature_SaveAs_Unfinished to Feature_SaveAs_040221_Automerge
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{7}: pull: Fast-forward
5ac1604 HEAD@{8}: checkout: moving from Feature_SaveAs_040221_Automerge to Feature_SaveAs_Unfinished
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{9}: checkout: moving from Feature_SaveAs_040221_Automerge to Feature_SaveAs_040221_Automerge
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{10}: checkout: moving from master to Feature_SaveAs_040221_Automerge
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{11}: checkout: moving from temp to master
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{12}: checkout: moving from b21832d0d8e5b9b58aa33cd8fd1c11815f635756 to temp
b21832d (HEAD -> Feature_SaveAs_Unfinished, origin/Feature_SaveAs_Unfinished, master, Feature_SaveAs_040221_Automerge) HEAD@{13}: checkout: moving from bb442dfc6900031ab9a17be4f3ea465a90d7b86f to origin/Feature_SaveAs_Unfinished
bb442df HEAD@{14}: commit: Removing old logs
f7ef5de HEAD@{15}: commit: SaveAs sollte gehen. Test fehlt noch

Git 显示

git show bb442df
commit bb442dfc6900031ab9a17be4f3ea465a90d7b86f
Author: qohelet
Date:   Thu Feb 4 09:03:16 2021 +0000

    Removing old logs

diff --git a/DjangoMoP/settings.py b/DjangoMoP/settings.py
index 3e81225..316d976 100755

运行 git reflog 得到 Git 溢出 HEAD reflog 的内容。这将为您提供提交哈希 ID(在左侧)、编号为 @{...} 后缀的名称(在哈希 ID 旁边),以及有关 HEAD 识别的提交的原因的信息(对于提交,即提交主题行)。

如果其中一个主题行看起来很有希望,请尝试提交哈希 ID:例如,git show <em>hash</em>。如果那是您正在寻找的提交,那么您已经找到了:为它创建一个分支名称。如果没有,请继续使用 reflog。要创建指向给定提交哈希 hash 的新分支名称 newname,请使用 git 分支 <em>newname hash</em>.

鉴于您有一些可以搜索的数据(或像 9dc18eb8bba4d381ad0a96c782fec57928dc92d2 这样的 blob 哈希 ID——例如,查看 git show 9dc18eb8bba4d381ad0a96c782fec57928dc92d2 的输出以查看是否是感兴趣的文件)您还可以在 reflog 中搜索提交,以查看它们中是否有任何一个在其快照中具有具有该 blob 哈希 ID 的文件。这通常不如快速“查看前几个 reflog 条目”方法有效,但请注意 git ls-tree -r <em>hash</em> | grep 9dc18eb8bba4d381ad0a96c782fec57928dc92d2 是一种查明给定的提交哈希 ID hash 是否指向该文件版本的方法。

旁注:您链接的答案指的是某人在 git rebase 中对他们的分离式 HEAD 设置进行操作,然后丢失了它;您引用的命令很有用您设置了分支名称以便能够找到提交之后。