2017-11-05 4 views
0

リモート(中央)リポジトリに複数のブランチがあり、最初はリモートリポジトリの正確なコピーがローカルにあるとします。多くのブランチを含むリモートリポジトリを使用するにはどうすればいいですか?

これで、リモートリポジトリのブランチの1つで何かを変更したいと思います。リモートブランチのローカルコピーを変更してプッシュしようとしましたが、この場合、解決しにくいマージ競合が発生する可能性があります。だから、私は1つが次の操作を行う必要があることを推測する:

  1. は、リモートブランチ(支店A)のローカルコピー(分岐B)のローカルコピー(分岐C)を作成します。
  2. この「コピーのコピー」(ブランチC)に変更を加えます。
  3. リモートブランチをもう一度引き出します(ブランチA)。リモートリポジトリのローカルコピーを更新します(ブランチB)。
  4. リモートリポジトリのブランチ(B)(ブランチA、他の人が行った変更を含む)の(更新された)ローカルコピーにブランチCをローカルにマージします。
  5. リモートリポジトリのローカルコピー(ブランチB)(変更と他の変更を含む)をリモートブランチ(A)にプッシュできます。

私の説明は混乱するかもしれないと思います。 ABを押して、BCをマージし、Aの新しい状態(基本的には、再びABにコピー)を使用してBを更新し、Cを変更し、BAをコピーCBをコピー:だから、私は別の言葉でそれを要約してみてください。

行く方法はありますか?

+0

これは私には痛いほど複雑に聞こえます。リモートブランチを変更したいのであれば、引っ張ったり、変更したり、再度押すことを妨げているのは何ですか?提案されたワークフローが実際にマージ競合を回避し、マージ競合のような問題があると思いますか? –

+0

私のワークフローの背景には、マージ競合が発生した場合、2つの競合するブランチがローカルにあり、それらをローカルにマージする必要があるということです。したがって、マージ競合を避けることではなく、マージ競合を予期し、それに対してより良い準備をすることです。おそらく問題は、私がローカルブランチとリモートブランチの間の競合を解決する方法を知らないことです。 – Roman

+0

Gitでは、2つのローカルブランチの間に_always_をマージします。あなたがGitHubやBitbucketのプルリクエストのようなものを介してリモート上でマージを行うことについて話している場合を除きます。しかし、その場合でも、そこにマージする必要はありません。マージはいつでもローカルで行うことができます。 –

答えて

1

共有ブランチで作業するためのGitリポジトリで1つの非常に一般的なワークフローは(すなわち、複数のエンジニアが同じ/ほぼ同時に変更することができるブランチ)は以下の通りです:

git pull origin the_branch 
# work work work 
git push origin the_branch 

正しく指摘したようにあなたがプッシュに行くときに問題にぶつかる可能性があります。プッシュした瞬間に、他の人たちがすでに他のコミットをthe_branchの上にプッシュしている可能性があるからです。ここには2つの基本的なアプローチがあります。まず、あなたがあなたのローカルブランチにリモートthe_branchをマージした後、押し出し引くことができます:

git pull origin the_branch 
# possibly resolve merge conflicts, then make a merge commit 
git push origin the_branch 

このアプローチは、マージを作成し、ローカルブランチにコミットし、そのコミット通常、したがって、歴史の一部として表示される場合がありますまた、リモートブランチのあなたはマージコミット好きではない場合は、リベースは、ここに別のオプションです:

git pull --rebase origin the_branch 
# again, possibly resolve merge conflicts 
git push origin the_branch 

あなたはリベースオプションを行く場合は、あなたの場合と同様に、あなたは、リモートブランチの上に直接、あなたのコミットを敷設されるだろう地方支部はすでに他の人たちによってなされたコミットを既に持っていました。

どちらの手法でも、終わりのあるケースがあります。マージ/リベースとプッシュする時間との間に新しいマテリアルが入ってきたらどうなりますか?もしそれが起こるならば、あなたは再びマージ/リベースする必要があります。しかし、私の経験では、これはほとんど起こりません、そして、実際には私はこのことを一度覚えていません。あなたが記述何

1

は、標準的な開発プラクティスです - ローカルおよびリモートブランチは、リモートにプッシュする前に第三分岐C.

で行わ開発で、同じコミット(あなたのケースでは、AとB)に通常、プルし、結果の上にCをリベースします(通常はマージより優先されます)。

これは最も安全なIMOオプションです。

関連する問題