2017-06-19 9 views
0

parentブランチがリポジトリにあるとし、別のブランチをderivedとします。git:親ブランチで前のコミットをリセットする

git checkout -b derived 

derived枝は私のparentブランチの全てのコミットが含まれています。私はderivedブランチにさらに2つのコミット(D1とD2をコミット)を追加します。私のderivedブランチは、parentブランチの2つ前のコミットです。

親ブランチでいくつかの以前のコミットを修正し、新しいコミット "Pn"を追加します。この後、何らかの理由で私は私の派生ブランチはまさに私がderivedブランチからgit rebase parentを試してみました。この

Amended commits from parent branch ---> Pn ---> D1 ----> D2 

に見えるようにしたいが、それは、マージの競合の多くを与えています。 D1とD2の前にすべてのコミットをparentブランチと正確にリセットする簡単な方法はありますか?

答えて

1

そうではありません。コミットD1とD2は、望ましくないものも含めて、それらの前のすべてのコミットに依存します。しかし、ここでは、物事はあなたが試すことができます:新しい親に派生

  • git rebase --onto parent derived~3 derived

    リベース。これにより、マージベースが明示的にderived~3に設定されます。コミットは、派生ブランチを作成したときの親のHEADです。これにより競合が軽減され、古い変更が再導入されることはありません。自動的

    通常、Gitのフィギュアこのうち、しかし、あなたはこれらのコミットを改正しましたから、GitはそれがA'コミットAの改正変種であるコミットこと言うことができない—  それらの間の任意の関係が存在することを伝えることはできません。

  • 桜が新しいブランチ

    git branch derived-new parent 
    git checkout derived-new 
    git cherry-pick D1 D2 
    git branch -m derived derived-old # Save the old branch until you're ready to delete it 
    git branch -m derived-new derived 
    
  • にD1およびD2を選択したくない以前のコミットを削除し、次に何が起こるか見て、派生ブランチのインタラクティブなリベースを行います。これはまた多くの余分な矛盾を生成し、あなたにgit rebase --abortに強制するかもしれませんが、もしそうでなければ、あなたはscott freeです...上記のように新しい親に再度リベースしてください。

0

次の手順を実行することができる必要があります:

  1. あなたparentブランチをチェックアウト
    • git checkout parent
  2. parent
      オフに基づいて新しいブランチを作成し、チェックアウト
    • git checkout -b derived-modified
    • derived-modified
    • 使用git cherry-pick(これは追加/変更したコミットを有する改変親ブランチを使用します)
      • git cherry-pick 000aaaa
      • git cherry-pick 000bbbb
      • derived-modifiedderivedから新しいコミットを移動するためにチェックアウトし
    • git cherry-pick 000cccc

これは、たとえば、3つのコミットをderivedにして、derived-modifiedに移動します。これには、変更されたparentブランチが含まれています。コミットがderived-modifiedにあることを確認したら、derivedを削除し、derived-modifiedという名前を変更できます。

git cherry-pickの詳細情報はhereです。

1

dogit rebaseを使用したい場合は、他のブランチとコミットを共有した時点で停止したいだけです。

あなたが持っていた、次のとおりです。

...--Pl--Pm--Pn <-- parent 
       \ 
       D1--D2 <-- derived 

コピーコミットによって改正とgit rebase仕事の両方ので、あなたが今持っていることは次のとおりです。

メモリ parent が慣れていること
  Pn'--Po--Pp <-- parent 
     /
---Pl--Pm--Pn <-- [email protected]{some-number} 
      \ 
       D1--D2 <-- derived 

オリジナルのコミットを含むPnは、parent(おそらくHEAD)。

あなたは手動git rebaseを使用してPnで停止するように指定することができます

git rebase --onto parent <hash-of-Pn> 

(すなわち、コミットハッシュとして<upstream>のための停止点を指定し、コピーをした後に行かせるために--ontoを使用新しいチップparent)。 jpaugh's answerのようなコミット相対構文(derived~number)を使用して、Pnを識別することもできます。詳細はthe gitrevisions documentationを参照してください。

Gitにも--fork-pointがあります。 --fork-pointを使用すると、が自動的にのルートを照らしてparentのためにPnを探し出そうとすることができます。ここでは、実行します:Gitはこの発根アラウンド行う、とはPnをコミットparentが、ドロップ上にリベースするように指示

git rebase --fork-point parent 

を。

--fork-pointが正常に動作するかどうかは、reflogエントリが期限切れになる(デフォルトでは30日後または90日後)ため、ちょっと厄介です。

関連する問題