Git-push.defaultの「マッチング」と「シンプル」の違いは何ですか


285

私はしばらくgitを使用していますが、自分で新しいリモートリポジトリをセットアップする必要がなかったので、興味がありました。私はチュートリアルを読んでいて、「git push」を機能させる方法に戸惑っています。

単純に使用するgit pushと、デフォルトのブランチ(?)をポイントして参照するように求められますか?この2つのオプションの違いは何ですか?

git config --global push.default matching
git config --global push.default simple

一致すると、ローカルリポジトリにあるブランチがすべてプッシュされます。一致しない場合は、手動で、ローカルリポジトリにある新しいブランチをプッシュするように指示する必要がありますか?これは使用するためのベストプラクティスですか、それともシンプルですか?



1
現在、pull.defaultこれらすべてのブランチをローカルで更新するためにのみ利用できる場合
Nogurenn

回答:


367

git push この構成に依存して、すべてのブランチまたは単一のブランチをプッシュできます。

すべてのブランチをプッシュする

git config --global push.default matching

すべてのブランチをリモートブランチにプッシュし、それらをマージします。すべてのブランチをプッシュしたくない場合は、現在のブランチのみをプッシュできます。

現在のブランチのみをプッシュ

git config --global push.default simple

したがって、私の意見では、このオプションを使用してコードをブランチごとにプッシュする方が良いと思います。ブランチを手動で個別にプッシュすることをお勧めします。


16
私はpush.default current@UpAndAdamの回答が好きでした。それについて知らなかった。
alanjds 2015年

4
simpleはオプションではなくなりました。では1.7.8.4、あなたがプッシュしようとすると、(およびそれ以前?)それはエラーになります。しかし、currentまだ利用可能である
sixty4bit

@ sixty4bit:私はgitバージョン1.7.1を使用しています。私はtracking->現在のブランチを上流のブランチにプッシュしています。
kevinarpe 2017

@ sixty4bitいいえ、それは後のバージョンのGitに含まれていましたが、どちらのバージョンかはわかりませんが、(1.7)は地獄のように古いですが、2016年でもそうです。このような古いバージョンの使用はお勧めしません。
Schmoudi 2017年

反対投票。申し訳ありませんが、リンクされたページのの説明はsimple意味をなさず、この回答と矛盾し、正しくありません。このため、この回答は混乱を招きます。リンクされたページは、simple「ブランチを1つずつプッシュします。主に現在のブランチに接続されています」と述べています。これは、並列ではなく順次にブランチをプッシュすることを意味しますか?「ほぼ接続されている」とはどういう意味ですか?次に、の説明simpleからの説明を引用しますmatching。これは、の説明matchingもに適用されることを意味すると考えられsimpleます。しかし、明らかにそれは真実ではありません。
tvanc

91

GITドキュメントから:Git Docs

以下に完全な情報を示します。要するに、リモートで同じ名前を持つ場合にのみ、それでもsimpleプッシュしcurrent working branchます。これは初心者にとって非常に良い設定であり、のデフォルトになりますGIT 2.0

一方、リモートで同じ名前を持つすべてのブランチをローカルにmatchingプッシュします。(現在の作業ブランチに関係なく)。つまり、共有したくないブランチを含め、多くの異なるブランチがプッシュされる可能性があります。

私の個人的な使用では、通常、別のオプションを使用します。currentこれは、現在動作しているブランチをプッシュします(変更のために常にブランチするため)。しかし、初心者のために私はお勧めしますsimple

push.default
refspecが明示的に指定されていない場合にgit pushが実行するアクションを定義します。さまざまな値が特定のワークフローに適しています。たとえば、純粋に中心的なワークフロー(つまり、フェッチソースがプッシュ宛先と等しい)では、おそらくアップストリームが必要です。可能な値は次のとおりです。

なし-refspecが明示的に指定されていない限り、何もプッシュしません(エラー)。これは主に、常に明確にすることで間違いを避けたい人を対象としています。

current-現在のブランチをプッシュして、受信側の同じ名前のブランチを更新します。中央ワークフローと非中央ワークフローの両方で機能します。

アップストリーム-現在のブランチを、変更が現在のブランチに統合されているブランチ(@ {upstream}と呼ばれる)にプッシュします。このモードは、通常プルするのと同じリポジトリ(つまり、中央ワークフロー)にプッシュする場合にのみ意味があります。

シンプル-一元化されたワークフローでは、上流のブランチの名前がローカルのブランチの名前と異なる場合にプッシュを拒否する安全性が追加された上流のように機能します。

通常プルするリモートとは異なるリモートにプッシュする場合は、現在の状態で作業します。これは最も安全なオプションであり、初心者に適しています。

このモードはGit 2.0のデフォルトになります。

マッチング-両端に同じ名前を持つすべてのブランチをプッシュします。これにより、プッシュするリポジトリは、プッシュされるブランチのセットを思い出すようになります(たとえば、メイントとマスターを常にプッシュし、他のブランチがない場合、プッシュするリポジトリには、これらの2つのブランチとローカルのメイントとマスターがあります。そこにプッシュされます)。

このモードの要点は、一度にすべてのブランチをプッシュできるようにすることです。通常、1つのブランチのみで作業を終了して結果をプッシュし、他のブランチは未完成の場合、このモードは適していません。また、他の人々が新しいブランチをそこに追加したり、コントロールの外にある既存のブランチのチップを更新したりする可能性があるため、このモードは共有の中央リポジトリへのプッシュには適していません。

これは現在デフォルトですが、Git 2.0はデフォルトをシンプルに変更します。


はい、しかし、push.default設定を使用しても、「$ git push origin master」を実行すると、現在のブランチからoriginへの同じ名前のブランチへのプッシュのみが行われると思います... デフォルトのリモコンもあることに言及する必要があります
Alexander Mills

1
あなたが何をしているのか理解できません。どのモードでgit push origin masterも、同じことを実行すると言います。モードとデフォルトのポイントは通常、単に言っただけでgit pushリモートまたはブランチにそれを伝えなかった場合に何が起こるかです。デフォルトの設定は何ですか?push.defaultのデフォルト設定を意味しますか?gitのどのバージョンのデフォルト設定...理解できない場合、コメントは非常にあいまいです。
UpAndAdam

'push.defaultは、refspecが明示的に指定されていない場合にgit pushが実行する必要があるアクションを定義します。設定したrefspecに依存します。git
scm.com/

2

Git v2.0リリースノート

下位互換性に関する注意

git push [$there]何をプッシュするのかがわからない場合、これまでは従来の「マッチング」セマンティクスを使用してきました(同じ名前のブランチがすでにそこにある限り、すべてのブランチがリモートに送信されました)。Git 2.0では、デフォルトが「単純な」セマンティクスになり、以下がプッシュされます。

  • 同じ名前のブランチへの現在のブランチのみ、および現在のブランチがそのリモートブランチと統合するように設定されている場合(フェッチ元と同じリモートにプッシュする場合)。または

  • 同じ名前のブランチへの現在のブランチのみ(通常はフェッチ元ではないリモートにプッシュする場合)。

これを変更するには、構成変数「push.default」を使用できます。あなたが「マッチング」セマンティクスを使い続けたいと思っている老人なら、例えば、変数を「マッチング」に設定することができます。他の可能性についてはドキュメントを読んでください。

場合git add -ugit add -Aコマンド行に追加するためにどの経路指定せずにサブディレクトリ内で実行され、それらは、との整合性のために全体のツリー上で動作git commit -aし、他のコマンド(これらのコマンドは、現在のサブディレクトリで動作するように使用されます)。言うgit add -u .か、git add -A .あなたは、現在のディレクトリに操作を制限する場合。

git add <path>git add -A <path>今と同じなので git add dir/、ディレクトリから削除したパスがわかり、削除が記録されます。古いバージョンのGitでは、git add <path>削除を無視するために使用されていました。本当に必要な場合git add --ignore-removal <path><path>、追加または変更されたパスのみを追加するように言うことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.