git機能ブランチを削除する適切なタイミングはいつですか?


88

82の機能ブランチがぶら下がってしまうことを望まないので、マスターにマージするとすぐに機能ブランチを削除することの潜在的な欠点は何であるか疑問に思います。

ワークフロー:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

ここに問題はありますか?


1
本当に必要な場合は、削除したブランチを後でいつでも復活させることができるので、問題はないと思います。
slebetman 2010

@slebetman私が知る限り、削除されたブランチを復活させることはできません。ただし、ブランチを削除する前に完全にマスターにマージされた場合は、ブランチはもう必要ありません。
シメオン

1
@Simeonはい、できます。Gitはコミットを削除しないため、ブランチを削除すると、その名前が削除されるだけです。削除されたブランチを復活させるには、そのブランチに最後にコミットしたことを覚えておく必要がありgit reflog、それを検索できます。次に、ハッシュをチェックアウトします
slebetman 2017

@slebetmanは、ブランチが最終的にマージされた場合にのみ真になります。コミットが取り残された場合、それらは最終的に到達不能になり、一定の時間が経過するとガベージコレクションの対象になります。reflogのエントリでさえ、最終的には削除されます。デフォルトでは約90日です。
黄金比

@goldenratio:そのための参照はありますか?
slebetman 2018

回答:


61

マージ後に削除するのが通常の方法です。これがgit branch -d yourbranchname、ブランチが削除される前に、ブランチが完全にマージされていることを確認する理由です。

ブランチを維持するために私が考えることができるいくつかの理由があります。本番環境に到達したときにバグが戻ってきた場合に備えて、ブランチを保持したい場合や、履歴レコードが必要な場合があります。

いずれの場合も、ブランチを削除する前に、ブランチのヘッドにタグを付けるオプションがあります。タグは、いくつかの小さな違いを除いて、コミットへのポインタであるという点でブランチに似ています。1)磁器は通常、チェックアウト時にgitshow-branchやtab-autocompleteなどの探索コマンドでタグを表示しません。2) 1つをチェックアウトすると、切り離された(非参照)HEADになります3)「タグ付けメッセージを残すことができます」を。これにより、タグがコミットのようにオブジェクトストアにオブジェクトとして保存されます。

このようにして履歴を保存します。バグ修正が必要な場合は、修正のためにマスターから新しいブランチを作成することをお勧めします。


1
タグをチェックアウトするとHEADが設定されますが、ブランチは自動的に作成されません。ブランチのないコミットのHEADは、それを切り離すものです。
バイナリアン2017

1
そうです、HEADをrefではなくコミットIDに設定します。私のOPのその部分は正しくありません。更新する必要があります。
石工2017

96

マージ後に削除しますが、git merge --no-ffブランチ履歴がグラフに表示されるように早送りを避けるために、常にを実行します。機能ブランチが開発ブランチから離れた場所と、再び参加した場所の履歴が欲しいです。

早送りの有無にかかわらずマージ

これは、Vincent Driessenによる成功したGit分岐モデルから取られています。これは、ほとんどのプロジェクトに適用するgitで使用するのに非常に優れたワークフローです。


これは、履歴を保持するためのもう1つの優れた方法です。これは、機能からは到達可能であるがマスターからは到達できないコミットを選択できるためです:rev ^ 1..rev ^ 2。欠点は、マスターブランチから実行する可能性のあるリベースを台無しにすることです(たとえば、マスターをアップストリームリモートにリベースし続ける場合、これは非常に一般的です)。
石工2010

1
私はその問題を抱えていませんでした。私たちのチームはgithubを介して同期し、通常はリベースする必要はありませんが、ここでの欠点はないと思います。開発ブランチと機能ブランチをリベースしても、ブランチはグラフに表示されたままになります。重要なのは、開発に関連する機能ブランチの内容であり、ブランチを作成したときに最初に出発したコミットではありません。
lkraider 2010

@Ikraider、リマインダーをありがとう。私が最初にgitを学んだときにその記事を見ましたが、今ではもっと理にかなっています。機能ブランチをリベースしmerge --no-ffますが、あなたが言うように履歴を見ることができるので、マスターに戻ります。
bstpierre 2010

7

機能のブランチを少しの間維持したい理由は2つ考えられます。

  • アップストリームでさらに作業を行うために、キックバックされる可能性があります。
  • 他の開発者は、マスターに他のすべてを必要とせずに、その機能を必要としている可能性があります。

実際には、ほとんどの場合、マージ後に削除しても問題ありません。


6

典型的なワークフローは

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

それが典型的なワークフローだと思います(マージ後に削除します)

編集それで、少なくとも短命のブランチについては、マージするのではなく、アイデアはそれらをマスターにリベースすることだと思います。その後、線形の変更履歴が作成され、ブランチ全体がメイントランクの一部になります。この場合、そこにすべての変更があるので、明らかにコピーは必要ありません。


ですから、ブランチを維持する意味は本当にありませんよね?
bstpierre 2010

1
「リベース」は避けることを強くお勧めします。リベースは一般的に有害であり、場合によってのみ有用です。
ディートリッヒエップ2010

9
リベースは、ローカルのプライベートブランチにとって完全に合理的なワークフローです。たとえばリベース(「リベースダウン」)することで、アップストリームの作業と同期を保つことは非常に一般的です。リベースすることはそれほど一般的ではなく、通常は有害です*。2番目の答えは実際には意味がありません。なぜなら、アップストリームの変更をリベースするかマージするかにかかわらず、それでも何らかの方法でそのようなものを「上に」プッシュする必要があるからです。ローカルブランチでも、ある時点でマスターするには機能をマージする必要があります。機能に基づいたままでいることの利点は、このマージが早送りされることです。
石工2010

1
ただし、最近、ブランチのリベースには注意が必要です。今では明らかですが、私は何ヶ月も長命のブランチに行き、常にすべてをマスターに対してリベースしました。最終的には約600のきめ細かいコミットになりましたが、マスターは大幅にリファクタリングされ、何度も完全に変更されていました。ブランチ全体を毎回リベースすることで、古いコミットを接続から、意味のあるマスターコミットにカットしていました。今では、必要に応じてマスターにマージすることを好みます。ブランチの履歴がまったく影響を受けない場合にのみ、リベースします。
Gary Fixler 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.