2009-08-01 6 views
7

私のリポジトリの1つの中のmasterからdeployのブランチにリベースする際に問題があります。Git rebaseは継続的に失敗し、手動でマージする必要があります

次のように私のレポを設置している:

master - of course, the main branch 
deploy - a branch created where files like Capfile, deploy.rb etc are created and configured - these changes will NEVER be merged back into Master 

一般的に私のワークフローは次のとおりです。

  1. は、... masterブランチ上でテストを開発しています笑顔、コミット。
  2. アウトdeploy
  3. が展開枝にgit rebase masterを実行する - これは問題にせずにリモートへ
  4. プッシュを仕事に使用して、私は今が午前問題

リラックスcap deploy

  • を実行します私がgit rebase masterをデプロイブランチで実行すると、3ウェイマージ/手動マージに必要なエラーが出てくることです(私はエラーメッセージが実際にポストできるほど一般的ではないと思います)。 Gitは私にマージを実行するように指示してからgit rebase --continueを使います。これはうまくいきません。

    私が見つけたのはgit rebase master --interactiveです。ピックリストをクリーンアップしています(このリストには5つの「コミット」がありますが異なる参照番号(同じメッセージ)があります)その中から手動でマージしてください。いったん私が各コミットのためにこれをしたら、私はリベースとそのすべての幸せを続けることができます...

    次回まで、私はリベースを実行する必要があります。

    誰も幸せになるかもしれないことを知っていますか?必要であれば、私は

  • +2

    デプロイメントブランチにはいくつのコミットがありますか? rebaseはすべての中間コミットをコミットのリストに保存する必要があり、実際にはそれ以上意味をなさない人工的な中間状態を維持しようとしているため、これらのいくつかが人為的な衝突を引き起こすように思えます。 –

    答えて

    1

    「繰り返された」コミットのコミット履歴が、異なるsha1を持つように変更した可能性があります。各sha1は、コミットだけでなく、コミット履歴にも固有のものです。したがって、(宇宙の生存期間中に起こる可能性は非常に高いとはいえ)不可能であり、同一の歴史において2つの同一のsha1を有すること、または2つの異なる歴史において2つのsha1を有することさえも不可能である。修正やインタラクティブなリベースなど、コミット中に何かを変更すると、sha1が変更されます。したがって、同じように見える2つのコミットは、実際は別々に扱われます。

    他のブランチからリベースしたり、対話型のリベースを行ったり、コミットを修正したりして、コードの同じ部分を変更したコードをコミットし続けました。あなたがブランチから削除したブランチとは異なるローカルブランチにあるコミットがブランチから削除され、あなたが既に取り込んだコミットを含めてアップストリームが取り込まれ、のsha1が変更され、コミットがブランチ上で再生した場合、コードの状態は、ブランチ上で現在行っているものとは異なる履歴から作成されたオリジナルなので、コミットが予想された状態から変更されたため、競合が発生します。うわー、それは長い文章でした...

    あなたがしていることは、リベースする前にこれらの繰り返しコミットを削除している可能性が高いため、変更を再適用していませんすでに適用されているので、それ以上の競合はありません。

    しかし、リベース中に競合を解決したいだけなら、これはおそらく最良の賭けになるので、間違ってあなたが望むコミットを削除しないでください。競合を解決することで、そのコミットの変更セットが異なる歴史を持つことになります。このマージの競合解決をプッシュすると、もう一度プッシュされたコミットを変更しない限り、問題は再び表示されません。

    git status 
    

    または

    git ls-files -u 
    

    をあなたが行うことができますmergetoolを設定している場合は、競合を持っているファイルわかったら:マージ競合が行う必要があり、どのファイルを見つけるために

    git mergetool <file> 
    

    手動でマージする場合は、マージマーカーとマージンを見つけるには、

    grep -Hnr '^=\{7\}\|^<\{7\}\|^>\{7\}' * 
    

    あなたのレポのパスの最上位にあり、編集してください。手動で編集するときは、マーカを削除して、ファイルの最終バージョンを望むように見せるようにしてください... gitはマーカーを特別なものにしません。あなたが手動で製作中終わったら、

    git add <file> 
    

    がインデックスに追加し、マージされていないフラグを削除するには、ファイルを追加して行うようにしてください。すべての結合されていないファイルの解決が完了したら、

    git rebase --continue 
    

    リベースを完了します。

    1

    あなたの「展開固有の」ファイルの親ディレクトリにattributeを定義することができ、メッセージ、ログ、枝グラフなどを投稿

    感謝することができますので、このプロジェクトは本当に「秘密」ではありませんマージの場合には常にデプロイブランチの内容を選択するためです。

    マージマネージャの例については、this SO answerを参照してください。

    その他strategies have been discussedしかし、キーは残っています:常にプロジェクトベースのマージではなく、プロジェクトベースのマージであるとみなします。そのため、いくつかの「特別な」ファイルに関して、そのプロジェクト全体のマージを洗練するための属性。

    2

    「=======」あなたは、実際にあなたが衝突マーカの間から欲しいパーツを選ぶ、(それらを編集「< < < < < < <を」競合ファイルをマージする必要が動作するようにgit rebase --continueを取得するには、 ">>>>>>>")、次にgit addをインデックスに追加します(インデックスは競合として記録され、ファイルを追加すると競合状態がクリアされます)。現在の差分をgit diff --cachedで確認し、次に正しく表示される場合はgit rebase --continueを確認します。

    リベースを試みる前に(または問題のあるアボートを打ち切った後)、git log -p master..deployを調べて、リベースしようとしているコミットを確認してください。あなたが持っているものと矛盾しているのは、マスターです。

    git rebase -iの 'pick'行を削除して削除したコミットは、コミットメッセージに同じ '件名'があるにもかかわらず、まったく同じではない場合があります。あなたがそこに1つだけあるべきだと思うという事実は、あなたのブランチで何か怪物が起こっていることを示しています。 の先端にあるこれらの「重複した」コミットがにデプロイされているのか、それとも後に他のコミットがありますか?たぶんそれらの '魚のような'コミット(log -p、上記)の内容を見ると、そのソースについての手がかりが与えられます。

    関連する問題