3

我刚刚在 Git repo 上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄得这么乱的……!

在 repo(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、brancheA、brancheB。brancheA 和 brancheB 不相关(涉及不同的文件)。

这是它目前的样子:

A -- B -- C -- D -- master
     \               \ change_from_B_1..4 -- change_from_A_1+2 -- brancheA 
      \ -- merge_from_master -- change_from_A_1 -- change_from_A_2 -- brancheB

我想哭:> 是的,change_from_A 的意思是“应该在 Branche A 中的更改”!最糟糕的是,在分支 A 中,在我将 master 合并到 brancheB 之前,有 4 个提交在 brancheB (change_from_B_1..4) 中使用。现在,这 4 个提交在 brancheA 中(如何??),不再在 brancheB 中。

我不知道我做了什么来解决这种情况,如果有帮助,这里是我的 git reflog 的一些摘录:

    b8b5db7 HEAD@{0}: checkout: moving from brancheA to brancheB
    015fdc1 HEAD@{1}: checkout: moving from brancheB to brancheA
    b8b5db7 HEAD@{2}: checkout: moving from brancheA to brancheB
    015fdc1 HEAD@{3}: checkout: moving from master to brancheA
    3830ccb HEAD@{4}: checkout: moving from brancheB_tmp to master
    2a9ba60 HEAD@{5}: cherry-pick: change_from_B_1
    3830ccb HEAD@{6}: checkout: moving from 3830cc to brancheB_tmp
    3830ccb HEAD@{7}: pull origin master: Fast-forward
    8ef3368 HEAD@{8}: checkout: moving from brancheB to master
    b8b5db7 HEAD@{9}: pull origin brancheA: Merge made by recursive.
    cc17c2e HEAD@{10}: pull origin brancheB: Fast-forward
    d867eff HEAD@{11}: HEAD^^: updating HEAD
    cc17c2e HEAD@{12}: checkout: moving from brancheA to brancheB
    015fdc1 HEAD@{13}: commit: change_from_B_6?? (lost :<)
    2f650f6 HEAD@{14}: commit: change_from_B_5?? (lost :<)
    9098bfa HEAD@{15}: commit: change_from_A_1+2
    01c7a5e HEAD@{16}: HEAD^^^: updating HEAD
    cc17c2e HEAD@{17}: checkout: moving from brancheB to brancheA
    cc17c2e HEAD@{18}: merge brancheA: Fast-forward
    d867eff HEAD@{19}: checkout: moving from brancheA to brancheB
    cc17c2e HEAD@{20}: commit: change_from_A_2
    3bee54e HEAD@{21}: checkout: moving from brancheB to brancheA
    d867eff HEAD@{22}: checkout: moving from brancheA to brancheB
    3bee54e HEAD@{23}: commit: change_from_A_1
    d867eff HEAD@{24}: checkout: moving from d867eff to brancheA
    d867eff HEAD@{25}: checkout: moving from brancheB to another_branch
    d867eff HEAD@{26}: checkout: moving from another_branch to brancheB
    d867eff HEAD@{27}: checkout: moving from d867eff to another_branch
    d867eff HEAD@{28}: commit (merge): Merge branch 'master' of super_github
    01c7a5e HEAD@{29}: commit: change_from_B_4
    1dbc4e1 HEAD@{30}: commit: change_from_B_3
    52417fa HEAD@{31}: commit: change_from_B_2
    8e5d258 HEAD@{32}: commit: change_from_B_1
    8ef3368 HEAD@{33}: checkout: moving from master to brancheB

对我来说,在我开始引入 brancheA 之前,一切看起来都很正常(d867eff HEAD@{24}: checkout: 从 d867eff 转移到 brancheA)。当时,我只是在编写代码,并没有真正关心 git……大错特错。无论如何,我不确定是什么造成了混乱,是 cc17c2e HEAD@{18}: merge brancheA: Fast-forward 吗?我不记得要求那个...!其余的可能是让混乱变得更糟的东西,我很惭愧把它放在这里,但在这一点上,我感到很无助。

我考虑过从头开始重新启动并从 master 重新生成所有提交,但是我会丢失代码审阅者在 github 上的所有评论,这将是一个巨大的损失。

我想做的事:

  • 删除 brancheB 中的 change_from_A_1 / change_from_A_2
  • 在从 master 合并之前移回 brancheA 中应该在 brancheB 中的提交

要达到这样的目的:

A -- B -- C -- D -- master
     \               \  -- change_from_A_1+2 -- brancheA 
      \ change_from_B_1..4 -- merge_from_master -- brancheB

你有什么建议吗?谢谢!!

4

1 回答 1

1

你总是可以解决这类问题。

  1. 分别在 branchA 和 branchB 创建 oldBranchA 和 oldBranchB。
  2. 将branchA重置为master,将branchB重置为B
  3. 结账分店A
  4. 樱桃挑选 change_from_A_1+2
  5. 结账分店B
  6. 樱桃挑选change_from_B_1..4,然后merge_from_master
  7. 删除 oldBranchA 和 oldBranchB
  8. 要推回原点,请执行git push -f branchA:branchA. 但是在这样做之前请考虑 10 次,因为您要做的是覆盖已发布的历史记录!
于 2012-08-18T12:42:03.347 回答