web-dev-qa-db-ja.com

マスターにマージしたときに機能ブランチを削除する理由

私が見たほとんどのgitワークフローは、branchをマスターにマージした後で削除することを提案しています。たとえば、この gitflow は次のことを示唆しています。

# Incorporating a finished feature on develop 
$ 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

なぜブランチを削除する必要があるのですか?後で機能によって導入されたバグが発見されたときに何をすべきかにも興味があります-同じ名前でブランチを再度作成し、そこでバグを修正し、マスターにマージしてブランチを再度削除する必要がありますか?

36
Maxim Koretskyi

理解しておくべき重要なことは、Gitブランチはコミットを指すラベルにすぎません。 Gitでの分岐は、文字通りの分岐です。 featureがコミットBであったときにmastermasterから分岐した場合、リポジトリは次のようになります。

A - B - C - F - H [master]
     \
      D - E - G - I[feature]

見る?実際のブランチ。 git merge featureをマスターにすると、これが得られます。

A - B - C - F - H - J [master]
     \             /
      D - E - G - I  [feature]

そして、git branch -d featureを実行すると、ブランチの履歴が残ります。

A - B - C - F - H - J [master]
     \             /
      D - E - G - I

Jには親HとIがいます。Jは親なしでは存在できません。Gitの仕組みに組み込まれています。私はGなしでは存在できません。GはEなしでは存在できません。ブランチは残っている必要があります

Jは、通常はマージされるブランチの名前を含むマージコミットです。他のコミットと同様に、課題追跡へのリンクのように、さらに情報を追加することもできます。

git merge --no-ffは、Gitが「早送り」を行ってブランチ履歴を失うのを防ぐために使用されます。これは、ブランチが作成されてからmasterで作業が行われていない場合に発生します。早送りは次のようになります。

A - B[master]- D - E - G - I [feature]

git checkout master
git merge feature

A - B - D - E - G - I [feature] [master]

masterfeatureの直接の祖先であるため、マージは必要ありません。 Gitはmasterラベルを移動するだけです。あなたのブランチ履歴は失われ、D、E、Gと私はマスターの個々のコミットとしてすべて完了したように見えます。 git merge --no-ffは、これを行わず、常にマージを実行するようにGitに指示します。

将来、Gでバグが発生したことに気づくと、リポジトリを閲覧している誰もがブランチの一部として行われたことがわかり、マージコミットを見つけてそこからブランチに関する情報を取得できます。

それでも、なぜブランチを削除するのですか? 2つの理由。まず、それはあなたの枝のリストを死んだ枝で散らかします。

次に、より重要なことは、ブランチを再利用できないようにすることです。分岐とマージは複雑です。使い捨ての短期間機能ブランチは、ブランチをマスターに1回だけマージすることを保証することでプロセスを簡略化します(== --- ==)once。これにより、多くの技術的および管理上の問題が解消されます。ブランチをマージすると、doneになります。そのブランチで発生した問題を修正する必要がある場合は、masterのバグとして扱い、新しいブランチを作成して修正してください。

残念ながら、git logはユーザーの側にあり、線形ではない履歴の線形表現を提示します。これを修正するには、git log --graph --decorateを使用します。これにより、上記の例のように線が描画され、各コミットのブランチとタグが表示されます。リポジトリのより真実のビューが表示されます。

Macを使用している場合、 GitX はリポジトリを視覚化します。 gitk は一般的なバージョンです。

52
Schwern

myfeatureブランチ履歴は、myfeatureを実装するために行われたすべての中間コミットを表すためです。

この戦略はmasterに1つのコミットのみを保持し、「 なぜデフォルトでgit fast-forwardマージが行われるのですか? "。

masterで行われた(マージされた)1つのコミットのコミットメッセージは、 'myfeature'を実装するために行われたことを明確にする必要があります。

修正する必要がある場合は、ブランチ名を再利用できます(以前に削除されたため)。

1
VonC