Git分离头-返回到早期提交并从那里应用更改

Git分离头-返回到早期提交并从那里应用更改,git,Git,我把我的git回购搞得一团糟,希望能有解决办法。我试图对坏掉的库依赖项进行一些升级。我找不到一种方法来撤销它们,所以我决定回到以前的提交,然后从那里开始工作,认为以后我会合并这些内容。然而,我最终将origin/master从头部分离,现在我无法将任何内容推送到远程回购。以下是当前情况的屏幕截图: 我一点也不在乎那树枝。我只想让它回到它爬出来的洞里。但我不能让它发生 我已尝试按如下方式还原提交: git revert 7921869 错误:无法还原,因为您有未合并的文件。 提示:在工作树中修复

我把我的git回购搞得一团糟,希望能有解决办法。我试图对坏掉的库依赖项进行一些升级。我找不到一种方法来撤销它们,所以我决定回到以前的提交,然后从那里开始工作,认为以后我会合并这些内容。然而,我最终将origin/master从头部分离,现在我无法将任何内容推送到远程回购。以下是当前情况的屏幕截图:

我一点也不在乎那树枝。我只想让它回到它爬出来的洞里。但我不能让它发生

我已尝试按如下方式还原提交:

git revert 7921869

错误:无法还原,因为您有未合并的文件。
提示:在工作树中修复它们,然后使用'git add/rm' “
提示:根据需要标记分辨率并 提交。
致命:还原失败

我还尝试推动这些变化:

git推送原点磁头:主磁头

去![拒绝]标题-> 主控(非快进)
错误:无法将某些引用推送到 ''
提示:更新被删除 已拒绝,因为推送的分支尖端位于其远程
提示的后面: 对应方检查此分支并集成远程 再次按下前的更改提示:(例如“git pull…”)。
提示:有关详细信息,请参阅“git push--help”中的“关于快进的说明” 详细信息。


git推送原始主机--force

错误:src refspec master不匹配任何。
错误:推送失败 参考文献 ''

我做到了:

git show ref

79218694bc34715b3d632dc0057f01fc2df2c842参考/遥控/原点/主

有谁能帮我解开这个,这样我的头就不会分离了?我需要
origin/master
与ddf4a1f提交保持一致,就好像f0dd017和7921869从未发生过一样。如果我只是执行
git checkout master
git checkout e416f24
我会丢失随后的4次提交,我不能让这种情况发生

谢谢

编辑

如果我没有解释清楚的话,左边的那条线是完美的。我只需要让主机指向最后的提交,这样我就可以再次推到远程。忘了粉红色的树枝吧。那是垃圾,我根本不想用它

编辑2

我遵循了Tim Biegeleisen下面的建议,我想我就快到了。现在我有了这个状态:

因此,现在当我执行git push origin master时,我得到以下结果:


! [已拒绝]主控->主控(非快进)
错误:失败 把一些裁判推到 ''
提示:更新被拒绝,因为您当前分支的提示无效 在
提示后面:它的远程对应项。集成远程更改 (例如,
提示:'git pull…')然后再次按下<提示:请参阅“注释” 关于“git推送-帮助”中的“快进”,了解详细信息

但是,如果我按照消息所说的去做,并且做了
git pull…
我会不会违背这个目的,从
origin/master
把垃圾带回来


我可以只做git push origin master--force吗?

结束这种疯狂的一种方法是在这种分离的头部状态下提交任何工作,创建一个新的真正分支,然后选择您想要提交到
master
中的提交。以下是如何做到这一点:

git commit -m 'final commit detached HEAD'  # save any remaining work
git checkout -b master_detached             # create new branch (perhaps optional)

git checkout master                         # switch to master
git cherry-pick <SHA-1 detached #1>         # cherry-pick 1st commit
git cherry-pick <SHA-1 detached #2>         # cherry-pick 2nd commit
...
这将把
master
7921869
提交回滚到
e416f24
提交。在这之后,简单的继续如上所述,通过挑选分离的提交

由于您重写了
主机
分支的历史记录,现在必须通过以下方式将其推送到远程:

git push --force origin master

请记住,如果许多人共享
master
,则可能不需要这样做。

>您有未合并的文件。这意味着您进行了合并,但完成了一半。您可能需要运行
git merge--abort
git push origin master--force
将丢弃
origin/master
在分支点之前的两个提交,并将
master
在分支点之前的四个提交推送到源。这听起来正是你想要实现的目标,确实如此。它成功了。我现在一切都好了。谢谢谢谢,但我相信这将延续“大师”分支的生命。我不想要那两个人因为他们把一切都搞砸了。我可以只做
git签出e416f24
,然后按照您的建议选择提交吗?这能达到同样的效果吗?嗯……要么我误解了你的问题,要么你不明白我的答案。我说的和你一样。只需签出
master
,然后选择cherry pick。您在分离头状态下所做的提交不在
master
分支中。可能是后者。当我执行git checkout master时,我会转到7921869提交。我不想去那里。我希望开始应用的提交是e416f24。我想扔掉f0dd017和7921869。我将更新我的答案,以考虑到这些信息。非常感谢您的帮助。这很有道理。我做到了这一点,现在本地
主机
已放在正确的位置。但我仍然有一个问题推回遥控器。你介意看一下我的编辑吗?再次感谢。我真的很感激!
git push --force origin master