別の開発者にパッチを送信し、マージの競合を回避するにはどうすればよいですか?
-
08-07-2019 - |
質問
別の開発者に送信するために、コミットからパッチを取得するにはどうすればよいですか?また、後日ツリーをマージするときに、このパッチとのマージ競合を避けるにはどうすればよいですか?
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
その後、追加および< href = "http://www.kernel.org/pub/software/scm/git/docs/git-commit.html" rel = "noreferrer"> commit diffの変更通常の方法。
ここで、パッチをmasterブランチ(パブリック)にマージする必要がある場合に興味深い部分があります。 C *
がmasterブランチの 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
いつものように、盲目的にパッチをコードに適用せず、常に最初に検査します。
パッチが適用されてからソースファイルが大幅に変更された場合、パッチによってソースコードが破損することもあります。
また、コードをチェックインしようとすると、マージの競合がないことを保証できません。
Bzrは&quot; merge directive&quot;の送信を処理します。つまり、相手に「OK」をクリックするだけでパッチを送信します。 マージすることで、パッチ/適用などの手間を省くことができます。
ちょうど: $ bzr send -o mycode.patch
Subversionには、これを行う良い方法はありません。はい、svn diff + patchを使用できますが、これはマージするまで問題を延期するだけで、それまでに忘れてしまった可能性があります。
Subversionで行う方法は、ブランチを作成し、ブランチでコミットを行い、パッチの受信者にブランチへの切り替えを依頼することです。その後、通常の方法でブランチをトランクにマージできます。