1

開発者が git 集中型ワークフローを使用しており、github に a.txt と b.txt の 2 つのファイルがあるとします。

これで dev1 は c.txt を正常にプッシュします。dev2 が d.txt をプッシュすると、早送りではなく、プッシュできず、当然のことながら、最初に dev1 の変更をローカルでマージしてからプッシュする必要があるためです。

別のシナリオとして、dev1 がブランチ featureC を作成し、その中に a.txt、b.txt および pushes とともにファイル c.txt があるとします。同様に、dev2 はブランチ featureD を作成し、その中にファイル d.txt と a.txt、b.txt および pushes を含めます。

これで、featureC を master とマージするプル リクエストが作成され、成功しました。再度、featureD を master とマージするプル リクエストが行われますが、これは成功するべきではありませんが、成功します。ありえない!! それはどうしてですか?上記のシナリオと一致しませんか?

4

2 に答える 2

1

あなたが説明する状況

dev1:

a---b - master
     \
      c - featureC

dev2:

a---b - master
     \
      d - featureD

集中レポ:

a---b - master

最初のシナリオ (同意しているようです) では、両方の開発者が集中化されたレポの同じブランチに直接プッシュしようとしているようです:

dev1 がそのローカルmasterを集中化されたものにプッシュした後:

a---b---c - master

次に、dev2 がローカルa---b---d - masterに持っていて、それを中央リポジトリにプッシュしようとするとmastergit文句を言います。それは何をすべきですか?

これ:

a---b---d - master #nope

cは破棄されるため、間違っている可能性があります。

これ:

a---b---c    #nope
     \
      +---d

どこをmaster指す必要がありますか?git知る由もありません。したがって、苦情masterは分岐しました。


次に、2 番目のシナリオに進みます。

プル リクエストの結果、集中化されたレポがプルされると仮定します。

"featureC を master とマージするプル リクエストが行われ、成功しました":

集中レポ:

      c - featureC
     / \
a---b---x - master

次に、「featureD を master とマージするプル リクエストが行われます」:

      c - featureC
     / \
a---b---x---y - master
     \     /
      +---d - featureD

これがうまくいかない理由がわかりません!中央集権的なレポであるため、最新の にfeatureDマージされ、分岐していません。mastermaster

于 2015-06-22T08:57:08.140 に答える
1

押すのと引くのとではかなりの差があります。コミットをリモート ブランチにプッシュする場合、ローカル リポジトリにはリモートからのすべてのコミットと、もちろんプッシュするコミットが必要です。これは、dev2 が d.txt のコミットをプッシュし、c.txt を導入した以前のコミットについて何も知らない場合には当てはまりません。

プルリクエストの場合、状況は異なります。競合しないものはいつでも安全にプルできます。これは、コミットが異なるファイルのみに影響する場合です。

実際には、最初のケースでは、プッシュする前に git が dev2 にプル (マージ) するように指示するプル リクエストです。

競合がない場合はいつでもプル (早送りまたはマージ) できますが、プッシュ先のリモート ブランチでブランチが最新の場合にのみプッシュできます。

何がコミットされるかを理解する方法

ローカル リポジトリの開発者は、コミットによって実際にどのような変更が要求されているかを簡単に確認できます。今朝、マスターからいくつかの機能を開発するために、dev1 が featureA に分岐したと仮定します。夕方、彼は自分が行ったすべての変更を確認したいと考えています。

git format-patch master..featureA

順番に番号が付けられたすべてのコミットは、ファイルに書き込まれますNUMBER-TITLE.patch

これらのすべてのパッチは、origin/master への適用に失敗したパッチがない場合(新しい変更が に行われたかどうかにorigin/masterかかわらず) の状態に関係なく、 にマージできます。origin/masterorigin/master

于 2015-06-22T10:27:24.777 に答える