9

私には「プライベート」と「パブリック」の2つのブランチがあります。私はプライベートで作業しており、定期的に「パブリック」ブランチのすべてを置き換えて、「プライベート」のファイルのクリーンコピーを作成したいと考えています。

「プライベート」の履歴を「パブリック」にしたくないので、を使用しますgit merge --squashが、それでも手動でマージファイルを1つずつ解決します。これを行うためのより良い方法はありますか?

4

2 に答える 2

11

おもう

git merge -X theirs private

あなたが探しているものです。もちろん--squash、好きなように追加することもできます。

于 2013-02-06T18:55:00.487 に答える
6

マージを押しつぶしても、コミットの両方のファイルで同じ行が変更されている場合、競合があるという事実は変わりません。

「public」ブランチのすべてを完全に破棄し、「public」の正確な状態を引き継ぐには、次のいずれかを実行できます。

  1. ours他のいくつかのコミットで指摘されているように、(戦略オプションではなく ) マージ戦略 を 使用し
    ます。ブランチは現在、マージ コミットを指しています。「プライベート」がマージ前のコミットを指すようにしたい場合は、実行してください:) (これは reflog を使用し、その間に「プライベート」を変更していない場合にのみこのように機能することに注意してください) )git checkout private
    git merge -s ours public
    git checkout public
    git merge --ff-only private
    git checkout private; git reset --hard private@{1}

  2. "theirs" 側を手動でチェックアウトします:
    2.a ブランチ "public" にいると仮定します (そうでない場合git checkout public)
    2.bgit merge --no-commit privateはマージ コミットを準備しますが、マージの競合があるかどうかに関係なく、コミットする前に停止し
    ます 2. c git checkout -f private -- .「プライベート」の現在の状態をチェックアウトする
    2.dgit add .競合を解決済みとしてマークする (存在する場合)
    2.egit commitマージ コミットを保存する。「public」は「private」とまったく同じ内容になります

編集:これは、Git の別のブランチのブランチを「マージ」ではなく「上書き」するにはどうすればよいですか?の逆のケースであることに注意してください。

編集 2: public の単一のコミットを非表示にする場合は--squash、もちろん、ここでもスイッチを使用できます (それぞれステップ 1.b と 2.b)。

于 2013-02-06T15:31:43.467 に答える