1

非常に大きなリポジトリがあり、クリーンアップが必要です。リポジトリはSVNからのもので、そもそも面倒でした。

多くのブランチがあり、それらのいくつかはトランクにマージされましたが、他はそうではありませんでした。残念ながら、SVNはこれを追跡しなかったため、SVNからのマージされた/マージされていないブランチは同じように見えます。(枝が風にぶら下がっているだけです)

これらの無関係な枝を切り落とし、少しきれいにしたいと思います。

コミットのSHA1を取得し、そのコミットで発生した変更のみをマスターにあるものと比較するにはどうすればよいですか?(したがって、特定のブランチのコミットのすべての変更がマスターにある場合は、ブランチを削除できます。そうでない場合は、ブランチを適切に維持できます)。

ツリーの例:

           o--o--o--o--o Unmerged from SVN
          /
o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o Master
    \                             \         /
     o--o--o Merged from SVN        o--o--o 

(Gitが知る限り、2つのブランチがマスターにマージされないことに注意してください。ただし、そのうちの1つでは、SVNリポジトリである間にマージされたため、すべての変更がマスターにあります。これは削除したいです)

4

2 に答える 2

2

とにかくブランチをマージしてみてください:

git merge --no-commit  YourDanglingBranch

これは YourDanglingBranch をマージしようとしますが、実際にはコミットしません。

YourDanglingBranch が既にマージされている場合、git は私のテストで何もしないほどスマートです。したがってgit merge --abort、このブランチを終了するために使用し、安全に削除して、別のブランチに進みます。

YourDanglingBranch がマージされていない場合、マージはコミットなしで行われます。変更を調べ、競合の可能性を解決してから、マージされたバージョンをコミットできます。

于 2012-08-17T16:02:39.263 に答える
1

ブランチには発散ハッシュがありますか? そうでない場合は、実行git checkout master && git branch -d <branch>して完了してください。小文字の-dフラグを使用すると、git は、チェックアウトされたブランチにマージされていないブランチの削除を拒否します (この例でmasterは ですが、任意のブランチである可能性があります)。

実際、これは簡単に自動化できます。この回答は、現在のブランチとマージされていないブランチを削除する git エイリアスを示しています。それが機能するのを見るのは少し恐ろしいですが、うまく機能します。

于 2012-08-17T12:43:59.573 に答える