早送りマージは、存続期間の短いブランチでは理にかなっていますが、より複雑な履歴では、早送りでないマージにより、履歴が理解しやすくなり、コミットのグループを元に戻すことが容易になります。
警告:非早送りには潜在的な副作用もあります。https://sandofsky.com/blog/git-workflow.htmlを確認し、「チェックポイントコミット」による「no-ff」を回避して二分または非難を解除し、それをのデフォルトのアプローチにするかどうかを慎重に検討してくださいmaster
。
(nvie.com、Vincent Driessen、「成功したGit分岐モデル」の投稿から)
開発時に完成した機能を組み込む
完成した機能は、次のリリースに追加するために、開発ブランチにマージされる場合があります。
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
この--no-ff
フラグにより、マージが早送りで実行されたとしても、マージは常に新しいコミットオブジェクトを作成します。これにより、機能ブランチの履歴の存在に関する情報が失われるのを防ぎ、機能を一緒に追加したすべてのコミットをグループ化します。
JakubNarębskiは設定についても言及しています:merge.ff
デフォルトでは、Gitは現在のコミットの子孫であるコミットをマージするときに、追加のマージコミットを作成しません。代わりに、現在のブランチの先端が早送りされます。この変数
をfalse
に設定すると、このような場合に追加のマージコミットを作成するようにGitに指示します(--no-ff
コマンドラインからオプションを指定するのと同じです)。
' only
'に設定すると、そのような早送りマージのみが許可されます(--ff-only
コマンドラインからオプションを指定することと同等)。
次の理由により、早送りがデフォルトです。
- 存続期間の短いブランチはGitで非常に簡単に作成して使用できます
- 短命のブランチは多くの場合、そのブランチ内で自由に再編成できる多くのコミットを分離します
- これらのコミットは実際にはメインブランチの一部です。再編成されると、メインブランチはそれらを含めるために早送りされます。
ただし、1つのトピック/機能ブランチでの反復ワークフローが予想される場合(つまり、マージしてから、この機能ブランチに戻っていくつかのコミットを追加します)、メインブランチではなく、メインブランチにマージのみを含めると便利です。機能ブランチのすべての中間コミット。
この場合、この種の構成ファイルを設定することになります。
[branch "master"]
# This is the list of cmdline options that should be added to git-merge
# when I merge commits into the master branch.
# The option --no-commit instructs git not to commit the merge
# by default. This allows me to do some final adjustment to the commit log
# message before it gets commited. I often use this to add extra info to
# the merge message or rewrite my local branch names in the commit message
# to branch names that are more understandable to the casual reader of the git log.
# Option --no-ff instructs git to always record a merge commit, even if
# the branch being merged into can be fast-forwarded. This is often the
# case when you create a short-lived topic branch which tracks master, do
# some changes on the topic branch and then merge the changes into the
# master which remained unchanged while you were doing your work on the
# topic branch. In this case the master branch can be fast-forwarded (that
# is the tip of the master branch can be updated to point to the tip of
# the topic branch) and this is what git does by default. With --no-ff
# option set, git creates a real merge commit which records the fact that
# another branch was merged. I find this easier to understand and read in
# the log.
mergeoptions = --no-commit --no-ff
OPはコメントを追加します。
[短命]ブランチの早送りにはある程度の意味があると思いますが、デフォルトのアクションにすることは、gitがあなたを想定していることを意味します...多くの場合[短命]ブランチがあることを意味します。合理的ですか?
Jefromiの回答:
ブランチの寿命はユーザーごとに大きく異なると思います。ただし、経験豊富なユーザーの間では、ブランチの寿命がはるかに長くなる傾向があります。
私にとって、存続期間の短いブランチは、特定の操作(リベース、可能性、または迅速なパッチとテスト)を簡単にするために作成し、完了したらすぐに削除するブランチです。
つまり、分岐したトピックブランチに吸収される可能性が高く、トピックブランチは1つのブランチとしてマージされます。特定の機能を実装する一連のコミットを作成するために、私が内部で何をしたかを知る必要はありません。
より一般的には、私は追加します:
それは本当にあなたの開発ワークフローに依存します:
- 線形の場合、1つのブランチが意味を成します。
- 機能を分離して長期間作業し、それらを繰り返しマージする必要がある場合は、いくつかのブランチが理にかなっています。
「いつ分岐すべきですか?」を参照してください。
実際、Mercurialブランチモデルを考えると、コアはリポジトリごとに1 つのブランチです(匿名のヘッド、ブックマーク、さらには名前付きブランチを作成できます)。「GitとMercurial-比較とコントラスト」を
参照してください。
Mercurialはデフォルトで匿名の軽量コードラインを使用します。このコードラインはその用語では「ヘッド」と呼ばれます。
Gitは、名前付きの軽量ブランチを使用し、リモートリポジトリ内のブランチの名前をリモートトラッキングブランチの名前にマップするために単射マッピングを使用します。
Gitはブランチに名前を付けることを強制します(まあ、名前のない単一のブランチを除いて、これは「切り離されたHEAD」と呼ばれる状況です)が、これはトピックブランチワークフローなどのブランチの多いワークフローでより効果的に機能すると思います単一のリポジトリパラダイムにおける複数のブランチ。
no-ff
」を「チェックポイントコミット」で使用しないでください。