12

私はgitを使用していて、次の状態になっています。

      X --- Y --------- M1 -------- M2 (my-feature)
     /                 /           /
    /                 /           /
   a --- b --- c --- d --- e --- f (stable)

これは、「my-feature」ブランチで1日以上作業している場合に発生します。M1とM2は、安定したブランチから機能ブランチにマージされます。M1とM2は、解決された競合をマージした可能性があります。安定したブランチを機能ブランチにマージするという全体的な考え方は、競合を後でではなく早く処理することです。

機能が完了したら、機能ブランチを1つまたは2つのコミットにリベースします。

問題は、インタラクティブなリベースgitを実行すると、M1とM2のマージ中にすでに解決したのと同じマージの競合が表示されることです。

M1とM2ですでに行ったマージ決定をgitに再利用させる方法はありますか?

4

4 に答える 4

12

マージの競合が同一である場合、これはgit rereregit で最も有用な (あまり知られていない) コマンドの 1 つである の完璧な使用例です。マニュアルページから:

比較的長い存続期間のトピック ブランチを使用するワークフローでは、開発者は、トピック ブランチが完了する (「リリース」ブランチにマージされるか、送信されて上流に受け入れられる) まで、同じ競合を何度も解決する必要がある場合があります。

このコマンドは、最初の手動マージで競合する自動マージ結果と対応するハンド解決結果を記録し、以前に記録されたハンド解決を対応する自動マージ結果に適用することにより、このプロセスで開発者を支援します。

git rerereは競合解決の記録を保持しgit merge、 、git rebase、またはgit commit(マージのコミット時) で同じ競合が発生したときに自動的に適用します。Scott Chaconがいくつかの素晴らしい例をここに投稿しました。manページも読む価値があります。

次のコマンドを発行して有効git rerereにすることができます。mergerebase

git config --global rerere.enabled true

--global単一のリポジトリに対してのみオプションを有効にする場合は、フラグを削除してください。

于 2012-07-08T15:51:06.497 に答える
8
git rebase --interactive --preserve-merges
于 2012-07-08T11:46:36.010 に答える
4

単一のコミットで機能ブランチfeatureを新しいブランチにする明示的な方法:feature-one-commit

git checkout -b feature-one-commit \
"$(git commit-tree HEAD^{tree} -m "Commit message" -p master)"    
于 2014-01-11T22:43:48.570 に答える