Git早送りVS早送りマージなし


247

Gitマージを使用すると、早送りを実行でき、早送りのブランチマージは実行できません。早送りマージを使用する場合と早送りマージを使用しない場合のアイデアはありますか?



2
私は別の本当に良い視点がここで見つけることができると思うendoflineblog.com/gitflow-considered-harmful
ドミトリーMinkovsky

回答:


290

この--no-ffオプションは、機能ブランチの概念を明確にしたい場合に役立ちます。そのため、その間にコミットが行われなかった場合でも、FFは可能です。メインラインの各コミットを1つの機能に対応させたい場合があります。したがって、一連のコミットを含む機能ブランチを単一のユニットとして扱い、それらを単一のユニットとしてマージします。を使用してブランチをマージする機能を実行すると、履歴から明らかです--no-ff

あなたがそのようなことを気にしないなら-あなたはおそらくそれが可能なときはいつでもFFで逃げることができるでしょう。したがって、ワークフローのsvnのような感覚が得られます。

たとえば、この記事の作成者は、--no-ffオプションはデフォルトである必要があると考えており、彼の推論は上記で概説したものに近いものです。

「feature」ブランチでの一連のマイナーコミットが集合的に1つの新しい機能を構成する状況を考えてみ--no-ffます。機能を実装しました。すべてのログメッセージを手動で読み取る必要があります。機能全体(つまり、コミットのグループ)を元に戻すことは、(--no-ff使用しない場合)本当に頭痛の種ですが、--no-ffフラグを使用した場合は簡単に実行できます[理由たった1つのコミットです。」

--no-ffが機能ブランチからのすべてのコミットをマスターブランチの1つのコミットにグループ化する方法を示す図


3
また、早送りは、密接に関連するブランチのコレクションがあり、時々一緒に移動したい場合に最適です。すべてのマージが実際の履歴イベントであるとは限りません。
カスカベル、2011

3
なぜいくつかのブランチを維持するのですか?それらが密接に関連している場合-なぜ単一のブランチですべてをしないのですか?
イヴァン・ダニロフ

11
密接に関連しているとは、同一であることを意味しません。その上、ワークフローは常にきれいであるとは限りません。あなたはいつも自分がやろうとしているコミットをするのではなく、常に最良の場所から分岐するわけではありません。たぶん、1つの場所からいくつかの機能を開始し、そのうちの1つで作業を開始し、それが一般的であることを理解し、分岐する前にもう1つの機能を早送りします。
カスカベル

2
最初の回答については、私の理解は、OPが従うべきベストプラクティスを知りたいということです。物事は起こり、すべてが理想的というわけではありませんが、これは強制的な妥協のようです。
Ivan Danilov、2011

1
現在のブランチにマージされたすべてのブランチからのすべてのコミットを引き続き表示するの--no-ffような基本的なツールを使用する場合、コミット履歴に対するメリットがすぐに明らかにならない可能性があることに注意git logしてください。とは言え、たとえばやgit log --first-parentなどの統合ブランチで使用すると、メリットがより明確になります。あなたは宗教的に使用している場合だろうこと、その後、排他的ながら、マージ要求を表示し、まだ(それ以上)の包括的な履歴を提供します。そのため、VincentはGitFlowでの使用を推奨しています。developmaster--no-ffgit log
Jeremy Caney、

12

プロジェクトでよく見られる例を挙げます。

ここで、オプション--no-ff(つまり、true merge)は、複数の親を持つ新しいコミットを作成し、より良い履歴追跡を提供します。それ以外の場合--ff(つまり、早送りマージ)がデフォルトです。

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*)ここで、newFeatureブランチが再利用される場合、新しいブランチを作成する代わりに、gitは--no-ffとにかくマージを行う必要があることに注意してください。つまり、早送りマージは常に適格とは限りません。


6

開発環境で作業し、コードをステージング/本番ブランチにマージする場合、Gitの早送りはより良いオプションにはなりません。通常、単一の機能の開発ブランチで作業する場合、複数のコミットが発生する傾向があります。複数のコミットで変更を追跡することは、後で不便になる可能性があります。早送りなしでGitを使用してステージング/本番ブランチとマージすると、コミットは1つだけになります。機能を元に戻したいときはいつでも、そのコミットを元に戻します。人生は簡単です。


0

また、コードが1日の終わりに配置されるだけのパーソナライズされた機能ブランチが必要になる場合もあります。これにより、開発をより詳細に追跡できます。

動作していないコードでマスター開発を汚染したくないので、--no-ffを実行するだけで十分です。

補足として、パーソナライズされたブランチで作業中のコードをコミットする必要はないかもしれません。なぜならgit rebase -i、同じブランチで他の誰も作業していない限り、履歴をサーバーに書き直して強制することができるからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.