0

基本的に、操作の結果として同じファイルに 2 つの個別の変更をコミットしたい場合、git add --patch <file>後で git svn rebase を使用git addすると、2 番目の変更をコミットするときに 1-2 の競合がスローされます。

だから私は基本的にこれをやっています(私はマスターブランチにいて、svnリポジトリを取得しました):

git checkout -b feature
... make two unrelated changes to file test.txt...
git add --patch test.txt
... add first change but ignore second one
git commit -m "change1"
git stash
git checkout master
git merge feature
git svn rebase
git svn dcommit
git checkout feature
git stash apply

ここには2つの方法があります。最初に機能する方法は次のとおりです。

git add --patch test.txt
... select everything (which is the second change in this case)
git commit -m "change 2"
git checkout master
git merge feature
git svn rebase
git svn dcommit

動作しないものは次のとおりです。

git add test.txt #notice there's no --patch
git commit -m "change 2"
git checkout master
git merge feature
git svn rebase #yields a conflict

では、2回目の変更に使用git add --patchすると問題なくsvnリポジトリにコミットできるのに、git add2回目の変更にのみ使用すると競合が発生するのはなぜですか? 私は git にまったく慣れていないので、これはばかげた質問かもしれませんが、私が見る限り、両方のコマンドセットはまったく同じように動作するはずです。

4

1 に答える 1

1

2 つのコミットのブランチを作成してからマージするのはなぜですか? git でのマージは svn での動作とは異なる方法で動作するため、これは問題を引き起こす可能性があると思います。

これはうまくいくはずです(「はず」ですが、うまくいくと確信しています):

# on master, no need to create a branch
$ git add -p file
$ git commit -m "first set of changes"
$ git add file
$ git commit -m "the remaining changes"
# apply your commit on top of eventually new changes upstream
$ git svn rebase
# commit your 2 commits to svn
$ git svn dcommit

in svn ブランチはディレクトリ (ほとんどの場合トランク ディレクトリ) のコピーに過ぎず、マージ コミットは通常のコミットと違いはありません ( svn:mergeinfosvn 1.6 以降の新しいプロパティを除く) 。

git のコミットは異なり、各コミットはその親コミットへのリンクを保存します。svn は単に REV-1 を使用できるため、これは必要ありません。したがって、git のマージ コミットには複数の親 (マージ ブランチとマージ ブランチ) があります。

git を svn に dcommit するとどうなるかわかりませんが、おそらく履歴なしでマージ コミット自体をコミットするだけです (メッセージは「ブランチ 'bla' を 'master' にマージしました」のようなものです)。

実行するsvn commitと、帯域幅を節約するために新しい変更のみがサーバーに送信されます。現在、git でのマージの動作は異なり、以前のバージョンとの違いはおそらく期待どおりではないため、git svn dcommit失敗します。

git svn のドキュメントにもそう書かれています: git を使用してブランチをマージして svn にコミットしないでください。履歴が台無しになる可能性が高くなります。

dcommit する予定のブランチで git merge または git pull を実行することはお勧めしません。Subversion は、合理的または有用な方法でマージを表すものではありません。そのため、Subversion を使用しているユーザーは、作成したマージを見ることができません。さらに、SVN ブランチのミラーである git ブランチからマージまたはプルすると、dcommit が間違ったブランチにコミットする可能性があります。 git svn ドキュメント

于 2010-09-05T11:44:22.897 に答える