git push.default = currentとpush.default = uploadの違いは何ですか?


89

git-configのマニュアルページには、push.defaultの次のオプションがリストされています。

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

ほとんどの場合、アップストリームブランチは通常同じ名前であり、同じ名前のブランチ( "current")であるため、ブランチのアップストリームブランチへのプッシュは同じ名前のブランチへのプッシュと同じであると思います。 )通常(または常に、定義上?)はアップストリームになります。では、違いは何ですか?

更新 git-configのマニュアルページが更新されたので(予想どおり)、そこで行われた区別がはるかに明確になる可能性あります。


2
開発者にとって、これらを区別するのは確かに面倒なので、「simple」が導入され、git-pushのデフォルトの動作になります。実際には、git 1.7.11
xhlwill 2012

14
最近のgit警告の詳細push.default is unset; its implicit value is changing in Git 2.0matchingvssimpleについては、stackoverflow.com / questions / 13148066
Nate

iconoclaust:私の編集によって質問の整合性がまったく変わったとは思わないので、古い情報を修正する必要があります。なぜユーザーにリンクをクリックするという余分な作業をさせるのですか?
Flimm 2013年

回答:


72

あなたはあなたの質問の違いを要約しました。設定されたアップストリームブランチにupstreamプッシュしますcurrentが、アップストリームブランチは現在のローカルブランチと同じ名前であると想定し、その特定の名前にプッシュします。実際には、ローカルブランチのアップストリームトラッキングブランチがローカルブランチ自体と同じ名前であると想定する理由はありません。

たとえば、複数のリポジトリで作業している場合、または多くの共有開発者リモートで作業しているallen-master場合susan-master、またはなどの同じブランチの異なるフォークを追跡することになります。どちらもmaster、アレンとスーザンのリポジトリのブランチをそれぞれ追跡します。この場合、currentこれらのブランチ名はリモートに存在しないため、設定が正しくありません。upstreamただし、問題なく動作します。

より実用的な例は、developmentproductionリポジトリの両方を追跡することです。ワークフローはそれぞれに異なるメインラインブランチを使用する場合がありますが、それは混乱を招く可能性があります。あなたがコードインテグレーターであり、両方のリポジトリのmasterブランチを別々に追跡したいとします。

git checkout -b production --track production/master
git checkout -b development --track development/master

これで、それぞれのリポジトリを追跡する2つのブランチができましたが、どちらもmaster命名規則をまったく使用していません。ブランチ名についてはほとんど混乱がありません。ブランチ名は、追跡対象を明示的に記述しています。それでも、push.default = currentどちらのリモートにもdevelopmentまたはproductionブランチが含まれていないため、意味がありません。


6
upstreamが優先される場合の例を2つ挙げていますcurrent。それはかなり明白だと思うので、逆の場合の例を示す必要があります。
AndreKR 2013

1
@AndreKR AFAIKcurrentは、git config特にどこかからクローンを作成した場合はそれほど必要がないため、新しい開発者の場合に適しています。currentリモートリポジトリ上の同音異義語のブランチがまだ存在しない場合は、プッシュまたは作成してからプッシュしますsimpleが、同じ名前のブランチがまだ存在しない場合は、これを完全に拒否します。upstreamこの場合、Yawarの回答に記載されているように、アップストリームブランチが明示的に設定されているか、そうでなければ設定されていない限り、同じ動作をします。
めったに 'モニカはどこですか'ニーディ

6

current 現在のブランチをリモートリポジトリ上の同じ名前のブランチにプッシュします。

upstream 現在のブランチをアップストリームブランチにプッシュします。

アップストリームブランチは、現在のブランチのアップストリームとして明示的または暗黙的に定義されているブランチです。これは、デフォルトでプッシュとプルがこのブランチと同期することを意味します。アップストリームブランチは、現在のブランチ自体と同じリポジトリにある場合があります。ローカルマスターブランチをローカル機能(トピック)ブランチのアップストリームとして設定し、それらの間でプッシュおよびプルするなど、興味深いことができます。

暗黙的なアップストリームセットアップは、branch.autosetupmergeconfig値を介して行われます。ドキュメントはgit configヘルプページにあります。明示的なアップストリームセットアップは-ugit branchコマンドのオプションを使用して実行されます。詳細については、ヘルプページを参照してください。


/branch.autoSetupMergeと同じ考えはないと思います。少なくとも、ドキュメントには、git pushがデフォルトで呼び出されたかのように動作することを示唆するものは何もありません。これは、あなたが言っているように思えます。意味を明確にできますか?-u--set-upstream-u
waldyrious

@waldyrious確かに; リモートトラッキングブランチをチェックアウトする場合、branch.autoSetupMerge設定はデフォルトで新しいローカルブランチを作成し、そのアップストリームをリモートトラッキングブランチとして設定します。この暗黙のアクションを明示的にどちらか使用して行うことができます-t--track)または-u ...--set-upstream-to=...わずかに異なる構文と同じことを行う)のフラグを、。
Yawar

1
私はここで何が起こったかを見る-この質問は約あることからgit push、私は(誤って)について、あなたは話していたと仮定-uのオプションgit pushではなく、-uの選択肢git branch。混乱してすみません:)
waldyrious19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.