私が見たほとんどの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
なぜブランチを削除する必要があるのですか?後で機能によって導入されたバグが発見されたときに何をすべきかにも興味があります-同じ名前でブランチを再度作成し、そこでバグを修正し、マスターにマージしてブランチを再度削除する必要がありますか?
理解しておくべき重要なことは、Gitブランチはコミットを指すラベルにすぎません。 Gitでの分岐は、文字通りの分岐です。 feature
がコミットBであったときにmaster
がmaster
から分岐した場合、リポジトリは次のようになります。
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]
master
はfeature
の直接の祖先であるため、マージは必要ありません。 Gitはmaster
ラベルを移動するだけです。あなたのブランチ履歴は失われ、D、E、Gと私はマスターの個々のコミットとしてすべて完了したように見えます。 git merge --no-ff
は、これを行わず、常にマージを実行するようにGitに指示します。
将来、Gでバグが発生したことに気づくと、リポジトリを閲覧している誰もがブランチの一部として行われたことがわかり、マージコミットを見つけてそこからブランチに関する情報を取得できます。
それでも、なぜブランチを削除するのですか? 2つの理由。まず、それはあなたの枝のリストを死んだ枝で散らかします。
次に、より重要なことは、ブランチを再利用できないようにすることです。分岐とマージは複雑です。使い捨ての短期間機能ブランチは、ブランチをマスターに1回だけマージすることを保証することでプロセスを簡略化します(== --- ==)once。これにより、多くの技術的および管理上の問題が解消されます。ブランチをマージすると、doneになります。そのブランチで発生した問題を修正する必要がある場合は、masterのバグとして扱い、新しいブランチを作成して修正してください。
残念ながら、git log
はユーザーの側にあり、線形ではない履歴の線形表現を提示します。これを修正するには、git log --graph --decorate
を使用します。これにより、上記の例のように線が描画され、各コミットのブランチとタグが表示されます。リポジトリのより真実のビューが表示されます。
myfeature
ブランチ履歴は、myfeature
を実装するために行われたすべての中間コミットを表すためです。
この戦略はmaster
に1つのコミットのみを保持し、「 なぜデフォルトでgit fast-forwardマージが行われるのですか? "。
master
で行われた(マージされた)1つのコミットのコミットメッセージは、 'myfeature
'を実装するために行われたことを明確にする必要があります。
修正する必要がある場合は、ブランチ名を再利用できます(以前に削除されたため)。