在 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 reflog
和 git 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
:它将显示您最近 运行 在您的回购上的操作列表,并且允许您在需要时恢复以前的状态。
在处理项目时,我搞砸了并使用命令 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 reflog
和 git 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
:它将显示您最近 运行 在您的回购上的操作列表,并且允许您在需要时恢复以前的状态。