いつGitでブランチを削除するのですか?


284

安定したアプリケーションがあるとします。

明日、誰かが大きなOLのバグを報告して、すぐにホットフィックスすることにしました。そこで、「マスター」からそのホットフィックスのブランチを作成し、「2011_Hotfix」という名前を付け、それをプッシュアップして、すべての開発者が協力して修正できるようにします。

バグを修正し、「2011_Hotfix」を「master」と現在の開発ブランチにマージします。そして「マスター」を押します。

「2011_Hotfix」で何をしますか?それはその目的を果たしたので、時間の終わりまで永遠にブランチとしてそこに存在するべきなのでしょうか、それとも削除すべきなのでしょうか?ブランチのリストが非常に長くなる可能性が高く、ブランチのリストが非常に長くなるため、ブランチをどこにでも置いておくのは不潔に思えます。

削除する必要がある場合、その履歴はどうなりますか?実際のブランチが利用できなくなっても、それは維持されますか?また、リモートブランチを削除するにはどうすればよいですか?


33
多くの場合、ブランチをアイデアとして考えると役立ちます。かなり良い経験則は、ブランチが表すアイデアの作業を終えたら(テストの終了やそれらの変更の組み込み(マスターへのマージ)など)、ブランチ自体で完了したということです。
Cascabel 2011年

3
知りたいこと:リモートの修正プログラムが削除されている場合、共同作業したすべての開発者がローカルで削除されますか?そうでない場合; これを達成する方法?一人がホットフィックスをマスターに移行すると思いますが、その後、すべての共同編集者もそのブランチにコミットを追加しないようにクリーンアップする必要があります。
rolandow

1
同僚のコンピューターのローカルリポジトリに影響を与えることはできません。ブランチをローカルで削除するように彼に指示する必要があるか、またはgitフック/ブランチセキュリティでこのサーバー側を強制して、削除したままにしておきたいブランチからのプッシュを防ぐことができます
srz2

回答:


183

でブランチを安全に削除できgit branch -d yourbranchます。マージされていない変更が含まれている場合(つまり、ブランチを削除するとコミットが失われる)、gitはそれを通知し、削除しません。

したがって、マージされたブランチを削除するのは安上がりで、履歴が失われることはありません。

リモートブランチを削除するには、を使用git push origin :mybranchします。リモート名がoriginで、削除するリモートブランチの名前がmybranchであると仮定します。


35
「マージされたブランチを削除するのは安上がり」ですが、維持することもできます。gitを使用し続ければ、時間やスペースの点でパフォーマンスに大きな影響はありません。とは言うものの、ブランチは削除します。これは、すべてのコミットがの履歴にすでに存在しているmasterため、よりクリーンになるためです。
MatrixFrog 2011年

22
ブランチを削除したい理由の1つは、ブランチで多くの変更(実際にはすべての変更)を行うため、最終的には「git branch」コマンドを使用すると長いリストが表示されるためです。概要については、そのリストを短くしたいと思います。そのため、古いブランチは削除されます。Realeのリリースにはタグが付けられているので、私にとってはこのような議論にはなりません。
michel.iamit 2014年

7
既にマージされているブランチを削除することに同意しますが、現在のブランチにマージされていないブランチのリストを表示したい場合は、次を使用できます:git branch --no-merged
lsklyut

51
@MatrixFrog gitを維持するのは安上がりですが、人的コストが高くなる可能性があります。約40のブランチを持つプロジェクトを入力しました。すべてブランチ名が数値です。私は何が何であるかを知りません、そしてそれらの枝のほとんどすべてが古くなっています。それらのブランチを検索し、何が疲れているかを理解するためのオーバーヘッドと時間がかかります。そう、そう、技術的には安いですが、実際にはそうではありません。私はGitリポジトリの形状を維持するのが好きです。アクティブなデバイスになく、マージされている場合は、削除してください。しかし、それは私のMOにすぎず、他の人が何か違うことをする可能性があることを尊重しています。
dudewad 2015

1
--no-mergedデフォルトにするコマンドは何ですか?私が試しgit config --global --add branch.noMerged trueて追加しましたが、違いはありませんでした。
Craig Silver

55

あなたがする必要があるのはあなたがリリースしたものにタグを付けることです。活発に開発しているときのためにブランチを置いておいてください。

古いブランチを削除する

git branch -d branch_name

それらをサーバーから削除します

git push origin --delete branch_name

または古い構文

git push origin :branch_name

これは、「オリジンのbranch_nameに何もプッシュしない」と読みます。

とはいえ、DAG(有向非巡回グラフ)がそれを指すことができる限り、コミットは履歴に残ります。

Googleの「git-flow」を使用すると、リリース管理、ブランチ、タグ付けについてさらに洞察を得ることができます。


31

質問には「github」タグが付いているので、これも追加します。具体的にはGithubで、ブランチをプルリクエストし、(UI経由で、またはプルリクエストのブランチをマージすることによって)マージされた場合、ブランチを削除しても、プルリクエストデータ(コメントを含む)が失われます

この結果:プルリクエストをワークフローの一部として組み込むと(コードレビューとうまく調和します)、ブランチがマージされたらすぐに安全にブランチを削除できます。これは非常に一般的であるため、プルリクエストをマージした直後に「ブランチの削除」ボタンをポップする(甘い)機能が最近Githubに追加されました。

ただし、各グループが最適なワークフローを採​​用する必要があることに注意してください(そのようなブランチの削除につながる場合もあれば、そうでない場合もあります)。たとえば、私の現在の作業チームは、プルリクエストがマージされるとすぐに、マスターまたはデプロイメント関連ではないすべてのブランチ(本番、ステージングなど)をプルーニングし、関連するコミットがどのように形成されたかを完全に追跡しています各製品の各増分改善。

もちろん、履歴管理(プルリクエストなど)はバージョンの適切なタグ付け(バージョンをデプロイ/パッケージ化する同じツール/スクリプトで自動化することが望ましい)に置き換わるものではないため、ユーザーが発生しているものにいつでもすばやく切り替えることができます。ある瞬間に。タグ付けは、元の問題を解決するための鍵でもあります。「work」ブランチにマージされたブランチは削除可能であり、削除する必要があることを確立し、バージョンタグ、「production」などにマージされたブランチは削除してはなりません。 、将来のバージョンに統合されるまで、修正プログラムは常に有効です。


2
Githubに「ブランチの削除」ボタンが表示された理由を説明していただきありがとうございます。
Todd Owen

私たちはsourcetreeを使用しており、ローカルのホットフィックスブランチとリモートのホットフィックスブランチを開いたままにするオプションを提供します。 ホットフィックスブランチを閉じることは、それを削除することを意味し、それを再利用することはできないと思いました。たとえば、今後5日間は毎日ホットフィックスをプッシュする必要があります。次に、それを閉じます。しかし、6日目に別の修正プログラムが必要だとしましょう。新しい修正プログラムのブランチを作成しますか?
危険

それは人々が通常行うことです。それらに個別に名前を付けることが不可能な場合は、日付に基づいて、またはそれらを管理するチケットシステムの参照(ある場合)に基づいて名前を付けることができます。もちろん、gitワークフローは「チームに最適なもの」に基づいて適用されることになっているので、別の方法で作業することにしても心配はありません。
chesterbr 2015

7

ブランチを削除することの不利な点は、GitHub(この質問にはgithubのタグが付けられています)でそれらのブランチへのハイパーリンクを解除することです。あなたは得られます404 Not Foundこれらのリンクのエラーを。これが、GitHubのブランチを削除した後で、リンクをコミットまたはタグを指すように変更する理由です。

メールなどの一部のリンクは変更できないため、GitHubブランチへのハイパーリンクを完全に回避し、初日からコミットまたはタグにリンクします。

私はブランチがマージされた後でブランチを削除することを好みます。これにより、リポジトリ内のブランチの長いリストが視覚的に雑然とするのを防ぎます。これらのブランチは、リポジトリのすべてのフォークにも伝播されます。

まず、ローカルブランチを削除します。これにより、後で誤ってプッシュされるのを防ぎます。

git branch -d branchName

次に、リモート追跡ブランチを削除します

git branch -dr remoteName\branchName

次に、GitHubのブランチを削除します。Webインターフェイスを使用していますが、同等のコマンドを以下に示します。

git push remoteName :branchName

ブランチがマージされない場合でも、通常は後世のためにコミットを維持したいと思います。しかし、私はまだブランチを削除したいです。コミットを広め、ガベージコレクターに食べられないようにするために、削除されたブランチと同じコミットを指す注釈付きタグを作成します。

git tag -a tagName commitOrBranchName

次に、タグをgithubにプッシュします

git push remoteName tagName

ガベージコレクターはいつブランチのコミットを食べるのですか?ブランチを削除する前にタグを付けてプッシュする必要がありますか?
Jared Thirsk、2018


4

2011_Hotfix履歴を失わずにブランチを削除したいようです。最初に削除について、次に履歴について説明します。

通常のgitブランチ削除方法についてはすでに説明済みで、期待どおりに機能します。gitには、「gitローカルブランチとリモートブランチの両方を削除します」という意味の1ワードまたは2ワードのコマンドはありません。ただし、この動作はシェルスクリプトを介して模倣できます。たとえば、Zach Holmanのシェルスクリプト 'git-nuke'を使用します。それは非常に簡単です:

#!/bin/sh
git branch -D $1
git push origin :$1

これを、ディレクトリのgit-nuke1つにある実行可能ファイル(たとえば、)に入れます$PATH2011_Hotfixブランチにいない場合は、実行git-nuke 2011_Hotfixするとローカルブランチとリモートブランチの両方が削除されます。これは、標準のgitコマンドよりもはるかに高速でシンプルです(おそらくより危険です)。

歴史の保存についてのあなたの懸念は良いものです。この場合、心配する必要はありません。にマージ2011_Hotfixするとmaster、からのすべてのコミットがのコミット履歴に2011_Hotfix追加されmasterます。つまり、単純なマージによって履歴が失われることはありません。

もう1つ付け加えることがありますが、それはおそらくあなたの質問の範囲を超えていますが、それでも関連性があります。20の小さな「進行中の作業」のコミットがあると想像してみましょう2011_Hotfix。ただし、の履歴に2011_Hotfix追加する完全なコミットを1つだけにする必要がありますmaster。20の小さなコミットすべてを1つの大きなコミットにどのように結合しますか?幸いにも、をgit使用して複数のコミットを1つのコミットに統合できますgit-rebase。ここではその仕組みについては説明しません。ただし、興味がある場合は、のドキュメントgit-rebaseが優れています。git rebaseは履歴を書き換えるので、特に初めて使用する場合は慎重に使用してください。最後に、あなたの2011_Hotfixシナリオは、一人の開発者ではなく、開発チームに関するものです。プロジェクトチームのメンバーが使用する場合git rebase、チームのgit rebase一部のカウボーイ開発者がプロ​​ジェクトのgit履歴に意図せず損傷を与えないようにするために、チームがの使用に関する明確なガイドラインを持っていることが賢明です。



2

originから削除されたローカルブランチをプルーニングしたい場合は、使用中にプルーニングすることもできます git fetch

git fetch --prune

0

github、BitBucketなどのすべての主要なWeb UIでブランチを削除できます。オンラインでブランチを削除した後、次のコマンドを使用してローカルブランチを削除できます。

git remote prune origin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.