1. ホーム
  2. git

[解決済み] git push.default=current と push.default=upstream の違いは何ですか?

2023-04-01 13:54:35

質問

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.

ほとんどの場合、上流のブランチは通常同じ名前であり、同じ名前のブランチ ("current") は通常 (あるいは定義上常に?) 上流であるため、ブランチの上流のブランチにプッシュすることは同じであると仮定します。 では、何が違うのでしょうか?

アップデイト : git-config のマニュアルページ が更新されたので(予想通り)、その区別のために が追加されました。 の区別はかなり明確になったのではないでしょうか。

どのように解決するのですか?

質問の中に、その違いがまとめられていますね。 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

これで、それぞれのリポジトリを追跡する二つのブランチができましたが、どちらも master という命名規則をまったく使っていません。ブランチの名前について混乱することはほとんどありません。ブランチ名は何を追跡しているかを明確に表しているからです。とはいえ push.default = current は意味をなさないので、どちらのリモートにも development または production という分岐があります。