web-dev-qa-db-ja.com

Gitで「--no-ff」マージオプションを使用する場合

成功したGit分岐モデル 分岐をマージするときに--no-ffを使用することをお勧めします。

--no-ffフラグを使用すると、マージが早送りで実行できる場合でも、マージは常に新しいコミットオブジェクトを作成します。これにより、機能ブランチの過去の存在に関する情報が失われるのを防ぎ、機能を一緒に追加したすべてのコミットをグループ化します。 […]

はい、それはさらにいくつかの(空の)コミットオブジェクトを作成しますが、そのコストよりもゲインははるかに大きくなります。残念ながら、--no-ffをgit mergeのデフォルトの動作にする方法をまだ見つけていませんが、実際にそうすべきです。

Gitワークフローについて ただし、not--no-ffを使用することをお勧めします:

そこで、新しいルールを追加します:「機能ブランチでマージするとき、–-no-ffを使用して新しいコミットを強制します。」これで仕事が完了し、先に進みます。 […]

--no-ffバンドエイド、壊れた bisect 、および blame ミステリーはすべて、ドライバーを使用しているという症状ですハンマーとして。 […]

両方のアプローチは異なるシナリオでは合理的と思われますが、「グッドプラクティス」と見なされるものは何ですか?

いつ--no-ffを使用しますか、使用しないのはなぜですか?

59
Leif

それはあなたがやろうとしていることに本当に依存しています。私の経験則では、マージが「何かを意味する」場合は--no-ffオプションを使用します。マージが実際には何も意味せず、リベースを使用した可能性がある場合、--no-ffを使用する理由はありません

Gitの利点は、非常に強力なツールであり、さまざまな方法で使用できることです。そのほとんどは間違いではありません。それを行う「正しい方法」とは何かを尋ねることは、絵を描く正しい方法は何かを尋ねるようなものです。

少なくとも私にとっては、コードでどのように協力したいかについてチームで頻繁に議論することで、私がそれをやりたいと思っている一連の方法です。私たちのやり方です。

44
Tomas

単一のコミットで終了したブランチの場合は、--no-ffを使用せずに、早送りしてください。これは、履歴がはるかに単純で混乱が少ないためです。 --no-ffがこの場合に利点をもたらすと主張するのは困難です。なぜなら、単一のコミットだけで開発の並行ブランチを見るのは面白くないからです。

# No fast-forward
$ git merge --no-ff awesome-feature
*   3aa649c Merge branch 'awesome-feature'
|\
| * 35ec88f Add awesome feature
|/
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003

# versus fast-forward
$ git merge awesome-feature
* 35ec88f Add awesome feature
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003

ブランチが1つ以上のコミットで終了した場合、ブランチされた開発が並行と順次に行われたという事実を保持するかどうかはあなた次第です。この分岐した作業を視覚的に確認し、必要に応じて単一の--no-ffで簡単に操作できるようにするために、おそらく複数のコミットにgit revert -m 1 <sha-of-merge-commit>を使用します。

# No fast-forward
$ git merge --no-ff epic-feature
*   d676897 Merge branch 'epic-feature'
|\
| * ba40d93 Add octocat.txt
| * b09d343 Add bye.txt
| * 75e18c8 Add hello.txt
|/
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003

# versus fast-forward
$ git merge epic-feature
* ba40d93 Add octocat.txt
* b09d343 Add bye.txt
* 75e18c8 Add hello.txt
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003

この場合、コミットメッセージ自体に追加情報がない早送りマージの場合、最後の3つのコミットが実際に1つの機能として属していることを確認するのは難しいでしょうか。

43
user456814

それは、ワークフローと、ブランチの使用方法に大きく依存します。

開発中に「マスター」と2つの機能ブランチ「foo」と「bar」があるとします。

この場合、ブランチは競合することなく異なる開発者の作業を可能にするためにのみ存在し、機能が完了したらマスターにマージする必要があり、それらの機能が異なるブランチで実装されたかどうかを知ることは重要ではありません。

しかし、ブランチ「foo」と「bar」がシステム内の独立したモジュールを指す場合、別のワークフローを使用できます。

この場合、一部のコミットにより、モジュールスコープ外のファイルが変更される場合があります。これらの2つのブランチをマスターにマージすると、特定のモジュールの外部にあるファイルのログが混乱し、それらの変更がどこから来たのかわかりにくくなる場合があります。

ブランチのマージの履歴がワークフローにとって重要かどうかを判断する必要があります。

そしてコメントに続いて、rebasepull --rebaseワークフロー。

2
Jonatan Goebel