私はgitを使って、一連のフィーチャブランチを作成し、完了時にmasterにマージします(git merge --no-ff
)。これにより、前のフィーチャブランチの開始点と終了点を識別するのに便利な空のマージコミットが作成されます。`git rebase --preserve-merges`へのより速い方法
複数の並行枝やネストされた枝を処理するために、私はリベースを使用します。私は戻ってマージすることはありません、私はいつも最新のコミットに私のブランチをrebaseし、テストし、最後にとマージするとすべてが完了します。ネストされたブランチでは、私は同じことをします:複数のブランチは、メインブランチに順番にマージされます。メインブランチは、最後にマージされます。
ネストされたブランチとのマージに関する情報を保持するために、私はしばしばgit rebase --preserve-merges
を使用します。これはまさに私が望むものであり、ワークフローには何の問題もありません。
gitの主な問題は、git rebase --preserve-merges
が非常に遅いことです(コミットあたり約2秒かかることがあります)。 What exactly does git's "rebase --preserve-merges" do (and why?)を読んだ後、gitは任意のグラフを処理しなければならないので、gitはマージを維持するために多くの作業を実行する必要があります。
私のワークフローは線形履歴に相当するグラフを生成するので、より速い方法でgit rebase --preserve-merge
を実行する方法があります。履歴の「線形性」を保証します空のマージだけがコミットしますか?私は、最終結果が正しい限り、スクリプトや奇妙なコマンドを使用しても構いません。
A-B-C
/ \
(1)--------D-- master
\
\---F-----I-- feature
\/\ /
E G-H
A-B-C E G-H
/ \/\/ \
(2)--------D---F-----I-feature
master
tl; dr:基本的な履歴が線形であることを知っているので、(1)を(2)に変換する方法はありますか?git rebase --preserve-merges
はそれほど多くの作業を必要とせず、高速ですか?
残念ながら私はUbuntuにいるので、それはそれに依存しているとは思わない。私が最後にこの問題を抱えたレポは、厄介な歴史を持つ多くの人々によって使用されたので、コマンドの遅さの要因となっていた可能性があります。しかし、私は私の特別なケースでは難しいことに同意しません。単純な 'git rebase'はそれを正しく非常に速く行います。私の唯一の違いは、マージコミットをスキップする代わりに、それらをコピー/再作成する必要があるということです。それほど難しいはずはありませんか? – Svalorzen
大きなリポジトリでは、 'git merge'自体が30分かかります。恐らくあなたのものは*この*大きなものではありませんが、併合を繰り返すことが原因かもしれません。インタラクティブなrebaseはシェルスクリプトであるため、 '-x'フラグをセットしてそれが動作するのを見て、遅延がどこにあるのかを知ることができます。 – torek