Git分离头 - 返回先前的提交并从那里应用更改

时间:2016-08-28 14:20:00

标签: git

我把我的git repo搞得一团糟,我希望有一个解决方法。我尝试对库依赖项进行一些升级,但这种情况很糟糕。我无法找到解除它们的方法,所以我决定回到之前的提交然后从那里开始工作,以为我会在以后合并。然而,我结束了原点/主人脱离了头部,现在我无法向远程回购推送任何东西。以下是当前状态的屏幕截图:

enter image description here

我不太关心那个分支。我只是想让它回到它爬出来的洞里。但我无法实现它。

我试图像这样恢复提交:

git revert 7921869

  

错误:由于您有未合并的文件,因此无法恢复   提示:在工作树中修复它们,然后使用' git add / rm   '
提示:酌情标记决议并制作一个   承诺。
致命:恢复失败

我也试图推动变革:

git push origin HEAD:master

  

https://xxx@bitbucket.org/xxx/xxx.git! [拒绝] HEAD - >   master(非快进)
错误:无法推送一些引用   ' https://xxx@bitbucket.org/xxx/xxx.git'
提示:更新了   被拒绝,因为推出的分支尖端在其远程后面提示:   对方。查看此分支并集成远程   更改左提示:(例如' git pull ...')再次推送之前   提示:请参阅关于快进的说明'在' git push --help'对于   的信息。

git push origin master --force

  

错误:src refspec master与any不匹配。
错误:无法推送   一些参考   ' https://xxx@bitbucket.org/xxx/xxx.git'

我这样做了:

git show-ref

  

79218694bc34715b3d632dc0057f01fc2df2c842 refs / remotes / origin / master

任何人都可以帮我解开这个问题,这样我就不会有一个独立的头脑吗?我需要origin/master与ddf4a1f提交一致,就好像f0dd017和7921869从未发生过一样。如果我只是git checkout mastergit checkout e416f24我会丢失4个后续提交,但我无法让它发生。

感谢。

修改

如果我没有解释清楚,左边的线是完美的。我只需要让主人指向最后的提交,这样我就可以再次推送到遥控器。忘记粉红色的分支。这是垃圾,我根本不想使用它。

编辑2

我按照Tim Biegeleisen的建议,我想我差不多了。现在我有了这个状态:

enter image description here

所以现在当我git push origin master时,我得到了这个:

  

https://xxx@bitbucket.org/xxx/xxx.git
  ! [拒绝]主人 - >主(非快进)
错误:失败   推动一些参考   ' https://xxx@bitbucket.org/xxx/xxx.git'
  提示:更新被拒绝,因为您当前分支的提示是   背后的提示:它的远程对手。集成远程更改   (例如左提示:' git pull ...')然后再推。
提示:请参阅'注意   关于快进'在' git push --help'详情。

但是,如果我按照消息说的那样做,并且git pull ...赢了,我就打败了这个的全部目的并从origin/master带回垃圾?

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

1 个答案:

答案 0 :(得分:2)

结束这种疯狂的一种方法是提交你在这个独立的头状态中的任何工作,创建一个新的真正的分支,然后挑选你想要的提交到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
...

命令git cherry-pick <SHA-1>告诉Git将一个哈希为SHA-1的提交应用于当前分支,在本例中为master。换句话说,使用cherry-pick,您可以有效地将处于分离HEAD状态时所做的提交移植到master分支上以进行安全保存。一个樱桃选择可以被认为是一个提交的合并,因此,你可以审查每个樱桃选择操作的合并冲突。

<强>更新

除了您在分离状态下进行的四次提交之外,您似乎在master分支之上做了几次错误提交。在这种情况下,您可以从master核对这两个提交。因此,在git checkout master步骤之后,您可以尝试以下操作:

git reset --hard HEAD~2

这会将master7921869提交回到e416f24提交。在此之后,简单地继续如上所述,通过挑选分离的提交。

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

git push --force origin master

请注意,如果许多人共享master,这可能是不可取的。