24

私は git/git-svn の学習曲線と戦ってきましたが、昨夜、その学習曲線の一部として、非常に悪いことをしました。その後、修正しましたが、エラーを自分のやり方で理解したいと思っています。

トランクとブランチのクローンを作成したsvnリポジトリがあります(タグは扱っていないため無視しました)。git を使用して、現在作業する必要があるブランチごとにローカル ブランチを作成しました。

$ git checkout -b trunk svn/trunk
$ git checkout -b feature1 svn/branches/development/feature1
$ git checkout -b maint svn/branches/maintenance/previous-version

私は feature1 をアクティブなブランチにし、数日間引き離される前にいくつかの変更を加えました。昨日、トランクに加えられた変更を統合して、最新かつ最高のものを使用できるようにしたいと考えていました。私が行ったのは、最初にgit svn rebaseを介してすべてのブランチを完全に更新することでした(feature1 ブランチでは誰も作業していませんでした)。私の svn リポジトリからすべてを最新の状態にして、リベースを試みました。

アクティブなブランチとして feature1 を使用して、トランクからの変更をfeature1 ブランチにプルすることを考えて、「git rebase トランク」を実行しました。私は非常に、非常に間違っていたことが判明しました。すべての競合をマージした後、git svn dcommitを実行したところ、トランクに変更が適用されていることがわかりました。

私の最初の質問は、私の思考プロセスのどこに核心的な誤りがあったかということです。2 つ目は、よく読んでグーグルで調べた結果、人々がプル、マージ、リベースを支持しているのを目にすることです。あるローカル ブランチに適用された変更を別のローカル ブランチにマージしたい場合、どうすればよいでしょうか? このシナリオのベスト プラクティスは何ですか?

ご協力いただきありがとうございます。

4

2 に答える 2

16

あなたが遭遇した問題は、リベースのコマンドライン構文があなたの(非常に合理的な、IMOの)期待と一致しないことです。

$ git checkout feature1
$ git rebase trunk

このシーケンスは、非共有のfeature1コミットをトランクのHEADに追加し、新しいトランクコミットをfeature1のHEADに配置することを期待していました。Gitのデータモデルがどのように実装されているかを知っている場合、構文は実際にある程度意味があります(これが、間違いなくその方法である理由です)。しかし、私にとっては、機能的には、私が期待するものとは逆です。それを恣意的な構成として学び、期待を持たないようにするのが最善です。

git-svnを使用してSVNリポジトリと対話する方法を理解しているのは正しいです。したがって、グーグルでプッシュアンドプルアンドマージについて見つけたものは無視してください。プッシュアンドプルアンドマージがgitとsvnで同じであるかのように振る舞う人々による、ほぼ正しい議論がたくさんあります。ほぼ正しいのはまだ間違っています。

于 2009-02-24T19:00:51.577 に答える
-3

git svn clone -sを使用して、すべてのブランチを含む完全な svn ツリーを複製する必要があります。それ以降は、master で git svn rebase と git svn dcommitを使用して svn を処理すると、個人的な使用のために通常の git ブランチを作成できます。

于 2009-02-24T16:06:57.827 に答える