3

Gitリポジトリで何かひどいことをしただけで、この問題にどのように取り組むかわかりません。どうやってこんなに散らかったのかわからない…!

リポジトリ(gitハブでホストされている)には、master、brancheA、brancheBの3つのブランチがあります。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は「ブランチAにあるべき変更」を意味します!最悪のことは、branche Aに、masterをbrancheBにマージする前に、brancheB(change_from_B_1..4)に使用される4つのコミットがあることです。現在、これらの4つのコミットはbrancheA(how ??)にあり、brancheBにはありません。

この状況に到達するために私が何をしたのかわかりません。それが役立つ場合は、gitreflogからの抜粋を次に示します。

    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}:チェックアウト:d867effからbrancheAへの移動)の導入を開始するまで、すべてが正常に見えます。当時、私はコーディングをしているだけで、gitについてはあまり気にしていませんでした...大きな間違いです。とにかく、何が混乱を引き起こしたのかわかりません。それはcc17c2e HEAD @ {18}:マージbrancheA:早送りですか?私はそれを求めたのを覚えていません...!残りはおそらく混乱をさらに悪化させたものであり、私はそれをここに置くことを非常に恥ずかしく思いますが、この時点で、私は本当に無力だと感じています。

ゼロから再起動し、マスターからすべてのコミットを再生成することを検討しましたが、コードレビューアーからのgithubに関するすべてのコメントが失われ、大きな損失になります。

私がしたいこと:

  • brancheBのchange_from_A_1/change_from_A_2を削除します
  • マスターからマージする前にbrancheBにあるはずのbrancheAのコミットを元に戻します

そのようなものに到達するには:

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 をマスターに、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 に答える