2011-06-23 14 views
5

私は非常に混乱しています。私はいくつかの記事、ブログ、記事を読んでいます。私はgit svnでプルダウンして作業するsvn server repoを使用しています。私は現在、これを開発している唯一の人です(つまり、上流の変更はありません)。git merge vs rebase git svnを使用

私は地元のgitのトピックブランチvacationを持っています。これは、マスターにdcommitをマージする必要がありますが、すべてのコミットを1つの大きなものにスカッシュしたくありません。

私はgit rebase -i masterを実行しようとしましたが、私の変更の90%が消去されました。

は私が

git checkout master 
git rebase vacation 
git svn docmmit 

それとも

git checkout vacation 
git rebase master 
git checkout master 
git merge vacation --ff-only 
git svn docmmit? 

私は誰かが簡単に私が何をすべきかを説明してくださいすることができます私は 前にしようとしたときに何が起こったのかC/Bその道の怖いとしますかなぜ私はそれをそのようにしなければならないのですか?

答えて

4

だから私はそれを理解したと思う。

git checkout vacation 
git rebase master 
[ masters's chages put behind this branches, replay every commit ] 
git checkout master 
git merge --ff-only vacation 
git svn dcommit 
[ each change goes into svn as seperate commit ] 

アップストリームの変更はありませんでしたが、これはまさに私が望むものでした。

+1

はい、これは正しいことです。 –

3

リベースしないマスターにマージまたはチェリーピックする必要があります。

なぜ、それは注文の質問です。 Rebaseは履歴を変更して履歴にmasterの前にトピックブランチを表示させたいことを意味します。あなたがマージするかチェリーピックするとコミットがマスターの上に追加されます。

だから、完全なサイクルは、私の個人的なセットアップからより完全に例をリベース説明するために

git checkout -b vacation 
[make changes] 
git commit -a -m "Commit message" 
git checkout master 
git merge vacation 
git svn dcommit 

のようになります。習得に加えて、私はまた、私は私のためのベースとして使用ローカルブランチの作業を維持プロジェクトのローカル設定。それは私が今までにコミットしたくないカスタムプロパティファイルのようなものを持っています。

git svn rebase 
git checkout work 
git rebase master 

は今のgitは、スタックの先頭にコミットするすべてのローカル設定を置く作業ブランチの歴史を再構築:私はこのマスターから始まるんので、私はマスターブランチと同期して、これを維持する必要があります。それは、マスターブランチ上のブランチBASEdをリテラルに再作成します。私はリベースするのではなく、

git merge master 

を発行した場合、その後lamenの目には結果は同じになりますが、歴史は確かに非常に異なるだろう。 2つの履歴が解決され、おそらくは他のものの上に基づくものの代わりに、マージコミットが発生します。

+0

誰でもダウンビートして、理由を説明できますか? – loosecannon

+0

また、編集が明確になります、それは私が望むものなので、私はマージするとき、私はsvnが理解する線形履歴が1つあり、マージコミットはありません – loosecannon