別の開発者に送信するためにコミットからパッチを取得するにはどうすればよいですか? また、後でツリーをマージするときに、このパッチとのマージの競合を回避するにはどうすればよいですか?
方法を知っている場合は、Subversion、git、Mercurial、bzr などの選択した VCS でこれを行う方法を説明してください。
別の開発者に送信するためにコミットからパッチを取得するにはどうすればよいですか? また、後でツリーをマージするときに、このパッチとのマージの競合を回避するにはどうすればよいですか?
方法を知っている場合は、Subversion、git、Mercurial、bzr などの選択した VCS でこれを行う方法を説明してください。
gitでは、次のgit-diff
ように 2 つのコミット間の出力をパイプできます。
git diff fa1afe1 deadbeef > patch.diff
patch.diff
を開発者に送信し、次のgit-apply
ように自分のワークスペースに送ります。
git apply patch.diff
他の開発者が自分のリポジトリで利用可能なコミットを既に持っている場合、次のようにマージせずに、いつでも自分でパイプすることができます。
git apply < git diff fa1afe1 deadbeef
ここで、パッチを master ブランチ (パブリック) にマージしなければならない興味深い部分が来ます。次のリビジョン ツリーを検討してください。マスター ブランチC*
から適用されたパッチは次のとおりです。C
A---B---C---D master, public/master
\
E---C*---F feature_foo
を使用して、上流のヘッドでgit-rebase
トピック ブランチ (この例では という名前) を更新できます。feature_foo
つまり、次のように入力した場合です。
git rebase master feature_foo
Git はリビジョン ツリーを次のように再配置し、パッチ自体も適用します。
A---B---C---D master, public/master
\
E*---F* feature_foo
アップストリーム ブランチへのマージは、簡単な早送りマージになります。また、新しいコミットが以前のおよびE*
それぞれのように機能することも確認してください。F*
E
F
同じ手順を使用して別の開発者のブランチに対して同じことを行うことができますが、パブリック リポジトリで行う代わりに、開発者のリポジトリからリビジョンを取得します。このようにして、他の開発者が自分のレポで公開したものから既に入手可能なパッチがあれば、その開発者にパッチを求める必要はありません。
パブリック ブランチをリベースしないように注意してください。コマンドは git の履歴を書き換えます。これは、人々が依存しているブランチでやりたくないことであり、リモート リポジトリにマージするときに混乱を招くからです。また、チームの他のメンバーが変更に参加できるように、頻繁に統合することを忘れないでください。
SVNでは、コミットする前に変更を加えるだけで、svn diffの出力をファイルなどにパイプします
svn diff > mypatch.diff
その後、変更を元に戻し、後日パッチを適用できます。
patch -p0 -i mypatch.diff
いつものように、やみくもにパッチをコードに適用するのではなく、常に最初に検査してください。
また、パッチが適用されてからソース ファイルが大幅に変更されている場合、パッチによってソース コードが破損することもあります。
また、コードをチェックインしようとしたときに、マージの競合が発生しないという保証もありません。
Subversion では、これを行う良い方法はありません。はい、svn diff + patch を使用できますが、これはマージするまで問題を延期するだけであり、それまでに忘れてしまう可能性があります。
Subversion で行う方法は、ブランチを作成し、ブランチでコミットを行い、パッチの受信者にブランチに切り替えるよう依頼することです。その後、通常の方法でブランチをトランクにマージできます。
Bzr は「マージ ディレクティブ」の送信を処理します。つまり、相手が「OK」をクリックするだけでマージできるようにパッチを送信し、パッチ/適用などで混乱することが少なくなります。
ちょうど: $ bzr send -o mycode.patch