git svn dcommitがローカルブランチのマージコミットの履歴を失うのはなぜですか?
質問
git svn clone
で作成されたローカルgitリポジトリがあります。ローカルブランチを作成し、いくつかの変更を加え、マスターに切り替え、 git svn rebase
を実行します。すべてがうまくいけば、ブランチをマスターにマージします。ツリーは次のようになります。
代替テキストhttp://img.skitch.com/20090108-cjguu3hcci9x2k17mcftamw8f1.jpg
時々、後で git svn rebase
してリモートの変更を取得すると、a_branchがメインラインにマージされたという事実が失われ、ツリーは次のようになります。
代替テキストhttp://img.skitch.com/20090108-kn3bn1qgi5ijw8ja5ijkd75pa3.jpg
それはなぜですか?止められますか?ブランチがマージされたことを確認する簡単な方法はありますか、または完了したらブランチを削除してマージされたものとされていないものを忘れないでください?
解決
git-svn manページでは、mergeを使用しないことを推奨しています。これは1つの副作用です。ブランチをリベースしているので(git svn rebaseは「git pull --rebase」に少し似ています)、事実上履歴を書き換えます。マージなど、すでにサブバージョンの上流にあるローカルコミットは破棄され、svnリポジトリに実際に存在するコミットのみが保持されます。ローカルブランチの些細なマージコミットにはSVNに相当するものがないため、「実際の」コミットのみをコミットします。変更されたため、これらはリベースされた新しいmasterブランチで見られる唯一の変更です。
理想的には、ローカルブランチは早送りのみをマージする必要があります。つまり、マージコミットは生成されません。そうでない場合は、ローカルブランチをマージするのではなく、マスターにリベースすることを検討する必要があります。これにより、マージコミットの作成が完全に回避されます。
他のヒント
svnを通過するため。そうすると、多くの情報が失われます(たとえば、作成者も失われます)。