在 git reset --hard 之后将新的提交从分离的头推回到 github 上的 origin main

Pushing new commit from detached head back to origin main on github after git reset --hard

在处理项目时,我搞砸了并使用命令 git reset --hard 恢复到最新提交(例如提交 ID:a12345),这也是该项目的最新工作版本。这导致 HEAD 与提交 a12345 分离。

之后,我做了一些更改,并决定暂存并提交这些新更改(提交 ID:b12345)。但是,由于我的 HEAD 已经分离,我无法将提交 b12345 中的这些新更改推送回 github 中的主分支。我已经尝试使用 git checkout 将 HEAD 设置为提交 b12345,但我仍然无法将提交 b12345 推送到 github。因此,我的问题是如何将我的新提交从我分离的头推回 github 中的主分支。

此图显示了我提交的工作流程,“最新提交”是提交 a12345,另一个提交是提交 b12345:

你说:

This resulted in the HEAD being detached from commit a12345.

在您的分支的 HEAD 进行 Git 硬重置应该而不是 将您置于分离的 HEAD 状态。通常发生这种情况的唯一方法是,如果您检查了其他提交,然后开始工作。

无论您如何到达分离的 HEAD 状态,您都可以使用以下方法保留您所做的任何提交:

git checkout -b branch_from_detached_head

如果你想要这个分支的完整历史,你可以将它推送到你的存储库。如果您 想要完整的历史记录,但可能会说最近的两次提交,那么您可以将它们挑选到其他分支上。无论哪种情况,您所做的提交肯定不会丢失并且可以挽救。

第一个git checkout <branch>脱离分离头状态。

然后使用 git refloggit show <commit-id> 找到您想要的孤立提交(如果您丢失了提交 ID)和 git cherry-pick <commit-id>git cherry-pick -n <commit-id>让它们在您的分支上恢复生机。

如果您处于屏幕截图中的情况,并且想要将您的 main b运行ch 移动到您当前的提交 b12345,有几种方法可以做到这一点.

这是其中之一:

# switch to the main branch :
git checkout main

# move forward to b12345 :
git merge --ff-only b12345

# --ff-only is optional : its advantage is to prevent accidentally creating merge
#   commits when you don't expect to ; if you see it fails, you can inspect your history
#   and choose what's the appropriate action to do (merge with a merge commit ? rebase ?
#   reset ?)
#
# in your current situation : the merge *is* a fast forward, and will work straight away

This resulted in the HEAD being detached from commit a12345.

强调@TimBiegeleisen 所说的内容:git reset 单独不会将您的回购变成分离的头部状态,您的回购在您的 git reset 操作之前已经处于该状态。

如果您想了解您是如何进入当前状态的,您可以 运行 git reflog :它将显示您最近 运行 在您的回购上的操作列表,并且允许您在需要时恢复以前的状态。