2017-08-24 2 views
2

をコミット:理解のgitの問題は、我々が過去に何らかの形で台無ししまった枝を持ついくつかの問題...以下のような状況を持っている

  • Dは、我々の配信ブランチです
  • Mはマスターブランチ
  • Fであるプロバイダから変更を受信すると、FはM
  • でリベースされ
  • Dから
  • コミットがM
  • にマージされている機能ブランチであります
  • M偶発Fのコミット(F2)が含まれ、M3というの復帰は
 
      D 
    D1-D2-D3-o 
    \  \___________ 
     \     \ M 
     \-M1-M2-D2-F2-M3-D3-o 
     \  /
     \ / F 
      \-F1-F2-F3-o 

をコミットしている今、私たちは再びMとFをリベースしようとしているが、我々はM3に戻っ変更F2が欠落しています最終的には。

  
      D 
    D1-D2-D3-o 
    \  \___________ 
     \     \ M 
     \-M1-M2-D2-F2-M3-D3-o 
         \ 
          \  F 
          \-F1-F3-o 

分岐Fに我々は単に使用:

git pull --rebase origin master 

をF2-M3へのリベースF1-F2-F3はF2を失う理由の説明はありますか?

Fのすべての変更を1つのコミットにスカッシングしてからrebaseを実行すると、F2に導入された変更がまだ存在します。

リベースインタラクティブモードを使ってMの履歴を書き直し、マージを維持しようとしました...私の考えは、偶発的なコミット(F2)とその復帰(M3)の両方を取り除くことでしたが、私が何かを緩めなかったという自信がある。

また、以下のバグ(https://git-scm.com/docs/git-rebase)に遭遇し、マスターの履歴を書き直すという考えを破棄しました。

によって提示ToDoリスト--interactiveが リビジョングラフのトポロジを表していない--preserveは、合流します。コミットを編集してコミットメッセージを再編集すると、正常に動作するはずですが、 再コミットを試みると、直観に反する結果が生じる傾向があります。

答えて

2

私はグラフが示すようにMF2Fはなく、マージのF2のチェリーピックであることを推測します。

rebaseを実行すると、gitはにあるが、Mにないすべてのコミットをチェリーします。F2はそれを選択しません。

あなたはそれを維持したい場合は、解決策はgit rebaseのすべての引数を使用することです:

git rebase --onto M $(git merge-base F M) F 
# equivalent to: 
# git rebase --onto M D1 F 

これはMの共通の祖先にとFF内のすべてのコミットをリベースしませんが(D1 )==>F1-F2-F3M


別の解決法の終了時には、対話型リベース(git rebase --interactive M F)を行うことで、その後、EX plicitlyリベース - TODOにpick F2を追加:

pick F1 
pick F2 
pick F3 
+0

グラフは、状況、変更がそこに着いた方法がわからないのほんの一例です。しかし、あなたの説明は理解できます。スカッシュ回避策の後に既に支店で働いていた私の同僚は、私たちがこのような状況に遭遇したときにあなたの提案されたrebaseを試すでしょう。 – Clauds

関連する問題