2016-04-05 7 views
8

私はhow to delete all local branches that have been mergedを知っています。しかし、これはGithubの新しいpull request squash and mergeの機能によるものだと私は考えていますが、自分自身には、マージされていない多くのローカルブランチが残っていますが、マスターにマージすれば変更はありません。マスターにマージされても変更されないローカルブランチをすべて削除するにはどうしたらいいですか?

これらのローカルブランチ、つまり必ずしもマージされる必要はないが、マスター(または、より一般的には現在のブランチ)に影響を与えないローカルブランチを、どのようにプルーニングできますか?

+0

多くのローカルブランチがマスターに比べて変化しないと本当に期待していますか?これは、誰かが枝を作り、それと何もしなかったことを意味するのではないでしょうか? –

+0

プロセスは次のとおりです:ローカルブランチを作成し、変更を加え、リモートにプッシュし、PRを提出し、PRがマスターに統合され、ローカルマスタを早送りします。 ( 'git branch -d'はそれを削除しませんが)マスターに比べて変更はありません(' git diff branch_name'には結果がありません)。したがって、私が10のPRを行った場合、変更のない10個の結合されていないローカルブランチがあります。 – Claudiu

+0

私はこのワークフローが嫌いです。どうしてマスターに戻ってしまったのですか? –

答えて

3

完璧な解決策はありませんが、十分に近いかもしれません。

クリーンな作業ツリーとインデックス(require_clean_work_treegit-sh-setupを参照)から始めてください。削除-ことができるかもしれない各候補枝$branchについては

  1. そのマージ対象(おそらくmerge_target=$(git config --get branch.${branch}.merge))を検索します。マージ対象を確認してください。
  2. --no-commitとマージします。またはステップ1で、--detachをチェックして、マージが成功した場合には中止できるコミットを得てください。
  3. マージが成功したと判断したかどうかをテストし、マージが成功したと判断した場合、現在のツリーが前のツリーと一致するかどうか、つまり変更されません。正確な一致をテストでき、コミットを許可する場合(--detach経由)、最後のテストは非常に簡単に行うことができます。git rev-parse HEAD^{tree}git rev-parse HEAD^^{tree} を実行し、ハッシュ。コミットを許可しない場合、現在のgit diffHEAD)が提案されたマージに対してコミットできます。 diffから何らかのノイズを除去する必要がある場合(例えば、コミット中ではないはずの設定ファイルなど)、これで実行する場所が与えられます。
  4. リセット(git merge --abort; git reset --hard HEAD; git clean -fまたはそれと同様、手順1〜3の実装方法に応じて異なります)。これは、次のパスのために、作業ツリーとインデックスを再びきれいにすることを意味しています。
  5. 手順3でマージして変更を加えなかった場合は、ローカルブランチを削除することができます。それ以外の場合は、そのまま使用してください。

本質的に、これは「実際にはマージを行い、何が起こるか見る」、完全に自動化されたものです。


この表記は少し奇妙に見えるが、それは^{tree}によって-followed HEADのちょうどHEAD^ -the最初の親です。代替のスペルは、HEAD~1^{tree}または${merge_target}^treeとなります。ここで、${merge_target}は、手順1でチェックアウトしたブランチです。これは、マージが成功したことを前提としています。マージ結果はgit mergeの終了ステータスにあります。ゼロは成功したことを意味し、ゼロ以外の手段は失敗し、おそらくマージの競合のために手動による支援が必要です。

+0

うーん、私は興味をそそられています!これは、私が自動的に好きなことをするコマンドを作成するのに十分なはずです。 Gitを使っていますので、モノリシックなバージョン管理システムではなく、コーディング言語としての評価を高めようとしています。これがどういう仕組みか分かっていれば、コマンド)を使用して、必要な機能(他の言語でも機能)を備えた新しいコマンドを書き込むことができます。 – Claudiu

+0

はい、特にgitの "plumbing"コマンドはスクリプトのためのものです。最上位レベルの 'git merge'は実際に配管コマンドではありませんが、ここで提供する必要があります。これを行うスクリプトの主な問題は、作成しようとしたブランチを削除することができますが、実際にはまだ作業を開始していないため、候補をフィルタリングしたい場合があります。 – torek

0

git "branch -v"を実行すると、変更が加えられた追跡ブランチの横に "先行"が書き込まれます。

その他の2つのオプション:「behind」と書かれていない場合、ブランチにはブランチに影響する変更がないことを意味します。

"git fetch"を実行してリモート追跡ブランチを更新し、 "git branch -v"の結果を解析して、どのブランチに変更がなく、どのブランチがあるかを調べることができます。

関連する問題