2011-10-31 5 views
5

Gitを使用しているbranch-per-featureワークフローについて聞いたことがあります。また、なぜthis could be a bad ideaという理由があるのか​​読んでいます。gitブランチを「古いものにする」ことを害することはありますか?

私の本当の疑問は、私が単純な正規表現時間パーサーのような小さな機能を開発している場合、このブランチをトランクにマージした後、そのブランチには何が起こるのだろうか?それだけでそこに座っていますか?私はそれを作成して以来、非常に特定の機能、私は戻ってブランチを使用しなければならない理由を考えることができません。私はどういうわけか、このブランチを何もしないものとしてマークするべきですか、それとも私の上を移動して忘れてしまいますか?

ありがとうございました

+3

完了したらブランチを削除することはできますか? ( 'git branch -d') –

+1

git branch -dは常に安全です。その後、ガベージコレクションされるリビジョンは失われません。 git branch -Dは、他の場所にはない変更を含むブランチを削除します。これは、アプローチが完全な行き止まりであると判断した場合に役立ちます。ディスクの空き容量を考えれば、おそらくgit branchを使うのは嫌でしょう。-D – tialaramex

+0

ブランチが単なるコミットのポインタであることを覚えておいてください。ブランチでの作業が終わったら、そのコミットをマージしたので、もうそれを指す必要はありません。 – Cascabel

答えて

13

フィーチャーブランチを使用する場合、マージ後にブランチでフィーチャーが作成されたという事実を保持したいと思います。そのため、履歴の閲覧がはるかに簡単になります。それは機能やバグによって変更をグループ化し、最も重要なこと、なぜ変更が行われたのかを簡単に知ることができます。

これが私がマージするとき、私は故意にgit merge --no-ffで早送りを無効にします。これは、歴史上の枝の構造を保持します。次に、ブランチラベル(git branch -d branch_name)を削除することができます。マージポイントにはブランチ名が含まれ、ブランチセットがクリーンアップされます。

これに対して、ブランチで作業する場合は、上流ブランチをリベースすることをお勧めします。これにより、ブランチの履歴が素早く清潔に保たれ、上流のマージノイズや競合解消はほとんどありません。私は一般的に上流に再統合して統合を簡単にします(ブランチ作成者として私は競合や壊れたテストを修正することができます)、結果として生じるマージクリーナーです。

この方法では、ブランチの履歴が保持されますが、古いブランチが開発されなくなることはありません。 gitkやGitXで履歴を可視化することは非常に便利です。

私はあなたがリンクした記事の基本的な点に同意します。同時に大規模な機能ブランチが増え、同時に競合や統合の問題が発生する可能性が高まります。それらをとても有用にする分離が責任となります。ソリューションの1つは、大規模な古い機能ブランチを持たないことです。フィーチャーブランチを完成させて統合することができれば、問題を回避することができます。これは、多くの場合、コードを見直さなければならない貧しい人々のような多くの理由で役に立ちます。

フィーチャブランチをメインラインに継続的に統合することができれば、フィーチャブランチは有用で、動作し、テストされ、文書化された作業を行わなければなりません。それがあれば、それらは自分の枝にスライスすることができます。

私は自由に私はこれにあまり読んだことも認めるが、記事の可能性が伝える欠陥の一つは枝がない機能にちなんで命名されているということです。これは、各ブランチが「青いウィジェットの追加」ではなく、「ジムが作業しているもの」のためのものであることを意味します。これは、個別の機能のためではありません

  • ではなく、枝が持つ個人の遊び場
  • ある

    • 機能や枝が個人またはチーム
    • 枝によってをを所有している...発達障害の数を意味します定義されていない機能は、彼らは上に行くことができる
  • 開発はサイロ​​で行われます
    • 個人が定期的に
    • 個人がこれの多くは技術的ではありません統合

まで

  • 個人が自分の変更について話していない枝に一緒に動作しませんお互いに話すことはありません。問題だが社会的問題。その多くはGithubのようなバージョンコントロールと強く結びついた良い問題追跡ツールを強く使用することで解決できます。主な変更点は次のとおりです。

    • 枝は、彼らがかもしれないがオフに行くと仕事の束をやっ
    • 誰も特徴(「所有しない」の前
    • 開発者が問題を報告する必要があります定義された機能のためにする必要があります

    残念ながら、ほとんどのプロジェクトのバグ追跡ポリシーでは、2番目の方法は推奨されていません。バグを報告する前にパッチを準備したいという衝動は非常に強いものです。

    良いブランチ管理には、強力なバージョン管理統合と歓迎するポリシーを備えた優れた問題追跡ツールが役立ちます。

  • 3

    不要な場合は削除してください。後でそれが必要であることが分かったら、もう一度それを作成することができます。変更を「トランク」にマージしたため、何も失われませんでした。

    0

    私が見ることができる唯一の理由、あなたの周りにそれを維持したいです:

    • あなたが最後にそれに取り組んだときの歴史をしたいです。
    • 開発開始時に推測できます。
    +1

    コミットを指す実際のブランチを持たなくても、履歴を見ることで両方を得ることができます。ブランチを持つ作業が完了し、別のブランチに結合されたときに、ブランチを維持する本当の理由はありません。 – poke

    +0

    合意。しかし、ブランチがコミットメッセージから行ったことをリバースエンジニアリングするのではなく、有用なブランチ名を見るほうがずっと簡単だと思います。 – Andy

    1

    2つのことを検討します

    1. は、たぶん、あなたがそれらを着陸前に、マスター(または場所)の先端にこれらのブランチをリベースの習慣を持っている必要があります。このように、KingCrushが上記のように厳密に冗長化されており、問題が見つかった場合は後で再作成するために破棄することができます。

    2. 名前を変更して特定のプレフィックスを再度入力する必要がある場合は、わからないブランチにマークを付けて、古いものを探していないことを知っているブランチのリストですばやくスキャンできます機能ブランチ。

    これらの技術をいくつか組み合わせて使用​​することができます。その後、ブランチfooをlanded-fooにリネームしてから、設定された間隔(例えば、1回のリリース、または30日後)にlanded-fooブランチを削除します。

    リベースして(リベースされたバージョンでテストを実行しても)、実際にコードが開発された後に発見されたバグが影響を受けていないことを確認できません開発後にマージすることができます。この場合、しばらくブランチを維持したいかもしれません。これは、あなたの質問のシナリオとは異なり、侵略的/非常に大きな変更でより頻繁に起こります。

    +0

    Rebaseは常に道を壊すので、良いアイデアではない、機能が開発されました。正しくマージすることに全く害はなく、gitは実際には広範囲の分岐やマージを処理するために開発されました。履歴に明確なブランチが表示されると、その機能が個別に開発されたことがわかります。必要に応じて後で簡単に識別できます。同様に、ブランチを削除することは、履歴内のコミットのポインタに過ぎないので、完全に安全です。ブランチを削除しても、それが属する履歴は削除されません。履歴には常に分岐/マージが表示されます。 – poke

    3

    Gitとブランチの素晴らしい点は、各ブランチが基本的にコミットのポインタであることです。ブランチをマージしたら、ブランチを形成するために使用されたコミットは、今やメインの歴史の不可欠な部分です。この時点で

            your branch 
                main 
                 | 
        (main) -------x----x----x-x---x----x 
            \    /
        (your branch) \--x--x-x--x-x---/ 
    

    あなたは「gitのブランチ-d」を使用して、あなたのブランチを削除した場合、あなたはで左している:

            main 
                 | 
        (main) -------x----x----x-x---x----x 
            \    /
        (your branch) \--x--x-x--x-x---/ 
    

    あなたが見ることができるように、あなたのブランチからのコミットはまだ安全です。変更されたのは、 "your branch"というポインタが削除されたことだけです。

    mainにマージしていないと、 "git branch -d"が失敗したことに注意してください。あなたの力がその時点でそれを削除した場合、あなたが残されるだろう:

            main 
                | 
        (main) -------x----x----x-x---x--x 
            \ 
        (your branch) \--x--x-x--x-x 
    

    この段階では何​​の分岐ポインタが存在しないため、コミットは「ダングリング」され、Gitがそのゴミを行い、次回に削除されますコレクション。

    短い話ですが、ブランチがマージされていれば、削除することができますし、削除する必要があります。マージされていない場合は、そうしないでください。

    関連する問題