2012-04-08 12 views
2

git pushを実行すると、3つのブランチが表示されます。 1)私が作業しているローカルブランチ、 'foo1' 2)ローカルリモートトラッキングブランチ 'origin/foo2'(常にプッシュ/プル後のリモートfoo3と同じコミットになります)3) 'foo3'リモートリポジトリ。当然通常はそれらはすべてfooと呼ばれますが、別の名前が必要なので、私はgitを正しく理解してこの質問をここで聞くことができます。私はどこでfoo2を指定できるのかわかりません。私が行うとgit pushの 'origin/master'部分を指定します。

git push origin foo1:foo3 

そして持つ

[branch "master"] 
remote = origin 
merge = refs/remotes/origin/foo2 

私.git/configにそのポイント1と3はOKですが、私は私の地元のレポの原点/ foo2はありません。私は何が欠けていますか?または、私のリモートトラッキングブランチが の場合は常にという名前のリモートと同じ名前の答えがあります。これは私にとってはうまくいくでしょう - 私はgitを正しく理解したいと思っています。

git-pushマニュアルでは、私の例では2つのリファレンス(refspec srcとdst)、ポイント1と3だけについても説明しています。リモートリポジトリのdstブランチが更新された後のマニュアルの話は、どこで更新されますか?

+0

@ VonCの回答は正しいです(もちろん:-))。ここでの根本的な問題は、あなたが 'プッシュ'と 'プル'の間の見かけ上の対称性を乗り越えていることです。それは間違った対称性です。 'push'の反対は' pull'ではなく 'fetch'です。 (それでも、それらは正確に対称ではありません)。そのことを念頭に置いて、すべてが理にかなっているはずです。 – torek

答えて

1

git pushには3つのブランチがありません。 2つだけ

foo2あなたが記述している(Gitは+ Gitのマージをフェッチ)またはgit rebase gitのプルです:
git configから)branch.<name>.remoteとともに

branch.<name>.merge 

定義し、上流分岐について指定されたブランチ
これは、どのブランチがマージするかを指示し、git pushにも影響します(push.default参照)。
ブランチ<name>にあるとき、gitはマージのためにデフォルトのrefspecをフェッチするように指示します。これはFETCH_HEADです。この値はrefspecのリモート部分のように扱われ、 "branch.<name>.remote"によって与えられたリモートからフェッチされたrefと一致しなければなりません。

マージ情報は、(最初​​の呼び出しでgit fetch)がをマージするため、デフォルトの枝を検索するgit pullで使用されています。
このオプションがない場合、git pullはデフォルトでフェッチされた最初のrefspecをマージします。
複数の値を指定して、タコのマージを取得します。

git1.7.10後と、デフォルトのプッシュポリシーがupstreammatchingに変更される可能性があります(branch.<name>.remoteの不存在下で)branch.<name>.merge上流枝を定義する、意味、(「What is the result of git push origin?」を参照してください) git pushにデフォルトで使用することができます。

0

リモートトラッキングブランチの名前は、リモートレポのブランチと同じです。そうでなければ多少混乱するでしょう!

したがって、origin/foo3は、リモートoriginにブランチfoo3を単に表しています。 git fetchの実行後、リモートと正しく同期されます。git pullを実行すると、実際にはgit fetch ; git mergeが実行されていることに注意してください。

git push origin foo1:foo3を実行するときは、ローカルブランチfoo1をリモートブランチorigin/foo3にプッシュします。したがって、あなたのケースでは、ブランチを指定することは意味がありませんfoo2

+0

参照してください。 'git checkout -b foo1;を実行できます。 git pull origin foo3:remotes/origin/foo2'を実行します。だからプルシナリオで私は今私の質問に記載されている3つの枝を正確に持っている。ここでは、おそらく3つの枝のそれぞれに特異性がある。たとえそれが意味をなさないことがあっても、3つの名前はすべて異なる名前を持っています。しかし、どういうわけか他の方法は、foo1とfoo3( 'git push origin foo1:foo3')にのみ影響し、foo2には影響しません。これは私を完全に混乱させます。私はその非対称性を理解していません。私は何かが恋しいと確信しています。 –