Git:撤销一个未知的错误

3

我有一些混乱的git仓库,希望能够整理。

在我的本地机器、bitbucket上以及除一台生产机器外的所有机器上,我的历史记录如下:

(本地和bitbucket)

* 1a84374 (HEAD, master) message
* 
* 
|\
| *
| *
* |
* | ea2d82c message
|/
* ccd87f7 message
*
*

最近出现了一个问题,我不得不ssh到我的一台生产机器上,并快速编写代码。想象一下非常紧急的情况。我猜可能是因为我匆忙,我必须在那个repo中弄错了什么。我记得做了一些rebase操作,我猜那就是错误所在的地方。无论如何,我把我的新代码保存到了一个新的分支中。在这台生产机器上,历史记录突然变成了这样:

* db19412 (HEAD, quickfix) message
*  57f8865 (origin/master, master) Merge branch 'master' of https://bitbucket.org etc etc
|\
| * 1a84374 message
| * 
| * 
| |\
| | *
| | *
| * |
| * | ea2d82c message
| |/
* |  39052e5 Merge branch 'master' of https://bitbucket.org etc etc
|\ \
| |/
| * ccd87f7 message
* |

您会注意到,现在有一条额外的线连接新提交和一些旧提交。我想我在rebase时可能犯了一些错误。我想摆脱它,但我仍然想保留我添加的新代码(在quickfix分支中),并最终将其推送到bitbucket。也就是说,提交db19412应该直接连接到1a84374。
那么,我如何摆脱这条只是让仓库过于复杂的额外线路呢?
编辑:因为这个问题涉及到撤销某些操作,所以我正在尝试这种方法。我尝试过的其中一件事是经典的“撤销上一个提交”。我把自己放在57f8865上,并使用命令git reset --hard HEAD~1,希望至少可以将master带回1a84374。这是结果历史记录:
* db19412 (quickfix) message
*  57f8865 (origin/master) Merge branch 'master' of https://bitbucket.org etc etc
|\
| * 1a84374 message
| * 
| * 
| |\
| | *
| | *
| * |
| * | ea2d82c message
| |/
* |  39052e5 (HEAD, master) Merge branch 'master' of https://bitbucket.org etc etc
|\ \
| |/
| * ccd87f7 message
* |

我完全迷失了。

编辑2:我想我可以把quickfix中的更改复制粘贴到我的本地机器上的新分支中,将其推送到bitbucket,然后在生产机器上nuke出现问题的repo,然后从bitbucket克隆一个新的。但是这样我就什么也没学到 :D


要回到之前的版本,只需执行 git checkout 1a84374 命令即可。 - Bryce Drew
1
也许停止随意操作,因为这只会使情况变得更糟,等待在这里的某个人给你一些建议。 - Ken White
1个回答

4
git checkout 1a84374
git cherry-pick db19412

这将你的快速修复添加到所需提交的顶部。现在,此历史记录可以与来自1a84374的其他工作合并。

下一步:

  • 将此更改添加到本地分支:git checkout -b branch_name,或者
  • 将此更改推送到远程分支:git push HEAD:remote_branch

完成这个操作后,如何将(本地)HEAD指向新的提交? - trent
头指向了被挑选的提交。你是不是想知道如何将头重新附加到分支上?我的编辑对你有用吗? - Bryce Drew
git cherry-pick db19412 将创建一个不同的提交 SHA1,但更改和提交消息将保持相同。 - Bryce Drew
抱歉,不是HEAD,我的意思是主分支(master)。OP 本地的主分支指向他不想再提起的某些内容。 - trent
我执行了前两个命令。现在git status显示HEAD detached from 1a84374 You are currently cherry-picking commit db19412。然后执行了git checkout -b temp。这变得越来越复杂了。 - user1950164
1
好的,明白了。在执行您的命令并将结果存储在名为“temp”的新分支中后,将“quickfix”和“master”都硬重置为“1a84374”。然后删除“quickfix”,将“temp”重命名为“quickfix”,一切都很好。谢谢! - user1950164

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接