web-dev-qa-db-ja.com

git Push.default = currentとPush.default = upstreamの違いは何ですか?

Git-configのmanページには、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.

ほとんどの場合、ブランチの上流ブランチへのプッシュは、同じ名前のブランチへのプッシュと同じであると想定します。上流ブランチは通常同じ名前を持ち、同じ名前のブランチ(「現在」 )通常(または常に定義により?)アップストリームになります。それで、違いは何ですか?

[〜#〜] update [〜#〜]マニュアルページgit-config が(予想どおり)更新されたため、 there の区別がより明確になりました。

84
iconoclast

質問の違いをまとめました。 upstreamconfiguredアップストリームブランチにプッシュしますが、currentはアップストリームブランチがcurrentローカルブランチと同じ名前を持っていると想定してプッシュします特定の名前。実際には、ローカルブランチのアップストリームトラッキングブランチがローカルブランチ自体と同じ名前であると想定する理由はありません。

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

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

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

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

70
Christopher

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

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

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

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

6
Yawar