12

だから私はgitを使用してsvnリポジトリと対話しています。

私は次のようなsvnTRUNKを持っています:

A-B-C-D

そして、コミットBまたはCで分岐するsvnbug_fixesブランチ:

 -c-d-e-f-g-h-i

次に、svnブランチにあるcdefghiコミットをマスターブランチに戻す必要があります。

スカッシュコミットを実行できることは承知しています。スカッシュSQUASH(cdefghiを含む)と呼びましょう。しかし、クリーンに続行するには、bug_fixesブランチを強制終了し、新しいブランチを開始する必要があるようです。

ここで:http://blog.red-bean.com/sussman/?p = 92彼らは提案します:

checkoutブランチ。

mergeマスターのブランチへの変更。

Checkoutマスター。

merge --reintegrateブランチのマスターへの変更。

開発を続けます。

残念ながら、git-svnはsvnの「merge--reintegrate」コマンドを認識していないようです。

では、git-svnのコマンドを使用して、ブランチとマスターにすべてのコミットをクリーンに作成し、両方の開発を続行できるようにするにはどうすればよいですか?

4

5 に答える 5

7

ドキュメントの警告セクションは警告しますgit-svn

単純化と機能の少ないシステム(SVN)との相互運用のために、すべてのgit svnユーザーがSVNサーバーから直接、gitリポジトリとブランチ間のすべての///操作を回避するcloneことをお勧めします。fetchdcommitgit clonepullmergepush

著者は推奨事項を提供します:

gitブランチとユーザーの間でコードを交換するための推奨される方法はgit format-patch、and git am、または単にdcommitSVNリポジトリに接続することです。

あなたの状況に適応する

git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch

ここでc、およびiは、履歴内のコミットの適切な識別子です。

于 2010-01-29T21:23:24.617 に答える
3

さて、私が見つけたいくつかのアプローチ:

git checkout your_branch
git rebase master
git checkout master
git merge your_branch

また

git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch

また

git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch

そしてその後。

git svn dcommit (to commit to master)
git branch -D your_branch

次に(git-svnは削除をサポートしていないためsvnから)ブランチを削除し、トランクから再作成して、サイクルを最初からやり直します。

于 2010-02-01T00:29:46.857 に答える
1

<branchpoint>..iこれは、ローカルのもの( )をSVNからフェッチされた新しいマスターにリベースするのに適したケースではないでしょうか?

于 2010-01-31T13:46:39.590 に答える
1

マージをdcommitすると、自動的に1つのコミットに押しつぶされます。残念ながら、内部的にsvn:mergeinfoまたは--reintegrateを使用しないため、「gitsvnbranch」を介して作成されたブランチとの関連付けが失われます。

于 2010-06-17T19:34:25.953 に答える
1

マージを使用しない場合は、チェリーピックも実行できます。

両方のステートメントは、変更せずにブランチで実行する必要があります。

cがiよりも古く、シーケンス全体を取得したい場合。

git cherry-pick c..i

または個別のコミット

git cherry-pick c d e f g h i
于 2013-10-23T12:00:22.520 に答える