完璧な解決策はありませんが、十分に近いかもしれません。
クリーンな作業ツリーとインデックス(require_clean_work_tree
:git-sh-setup
を参照)から始めてください。削除-ことができるかもしれない各候補枝$branch
については
:
- そのマージ対象(おそらく
merge_target=$(git config --get branch.${branch}.merge)
)を検索します。マージ対象を確認してください。
--no-commit
とマージします。またはステップ1で、--detach
をチェックして、マージが成功した場合には中止できるコミットを得てください。
- マージが成功したと判断したかどうかをテストし、マージが成功したと判断した場合、現在のツリーが前のツリーと一致するかどうか、つまり変更されません。正確な一致をテストでき、コミットを許可する場合(
--detach
経由)、最後のテストは非常に簡単に行うことができます。git rev-parse HEAD^{tree}
とgit rev-parse HEAD^^{tree}
を実行し、ハッシュ。コミットを許可しない場合、現在のgit diff
(HEAD
)が提案されたマージに対してコミットできます。 diffから何らかのノイズを除去する必要がある場合(例えば、コミット中ではないはずの設定ファイルなど)、これで実行する場所が与えられます。
- リセット(
git merge --abort; git reset --hard HEAD; git clean -f
またはそれと同様、手順1〜3の実装方法に応じて異なります)。これは、次のパスのために、作業ツリーとインデックスを再びきれいにすることを意味しています。
- 手順3でマージして変更を加えなかった場合は、ローカルブランチを削除することができます。それ以外の場合は、そのまま使用してください。
本質的に、これは「実際にはマージを行い、何が起こるか見る」、完全に自動化されたものです。
この表記は少し奇妙に見えるが、それは^{tree}
によって-followed HEAD
のちょうどHEAD^
-the最初の親です。代替のスペルは、HEAD~1^{tree}
または${merge_target}^tree
となります。ここで、${merge_target}
は、手順1でチェックアウトしたブランチです。これは、マージが成功したことを前提としています。マージ結果はgit merge
の終了ステータスにあります。ゼロは成功したことを意味し、ゼロ以外の手段は失敗し、おそらくマージの競合のために手動による支援が必要です。
多くのローカルブランチがマスターに比べて変化しないと本当に期待していますか?これは、誰かが枝を作り、それと何もしなかったことを意味するのではないでしょうか? –
プロセスは次のとおりです:ローカルブランチを作成し、変更を加え、リモートにプッシュし、PRを提出し、PRがマスターに統合され、ローカルマスタを早送りします。 ( 'git branch -d'はそれを削除しませんが)マスターに比べて変更はありません(' git diff branch_name'には結果がありません)。したがって、私が10のPRを行った場合、変更のない10個の結合されていないローカルブランチがあります。 – Claudiu
私はこのワークフローが嫌いです。どうしてマスターに戻ってしまったのですか? –