web-dev-qa-db-ja.com

Git - Push.defaultの "matching"と "simple"の違いは何ですか

私はしばらくの間gitを使ってきましたが、私は自分自身で新しいリモートレポジトリをセットアップする必要は一度もありませんでしたし、そうすることに興味がありました。私はチュートリアルを読んでいますが、 "git Push"を機能させる方法について混乱しています。

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

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

マッチングは私のローカルレポにあるブランチをプッシュするだけです、そしてそれらがマッチしないなら私は手動でそれを私が持っている新しいローカルブランチをプッシュするように言う必要があります、正しいですか?これがベストプラクティスなのか、それともシンプルなのか。

256
Josh

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

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

git config --global Push.default matching

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

現在のブランチだけをプッシュします

git config --global Push.default simple

私の考えでは、このオプションを使用してコードをブランチごとにプッシュするのが良いでしょう。手動でそして個別にブランチをプッシュするのが良いです。

321
Lalit Sachdeva

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

以下に詳しい情報があります。一言で言えば、simplecurrent working branchをプッシュするだけであり、それでもリモートで同じ名前を持っている場合に限ります。これは初心者にとって非常に良い設定で、GIT 2.0のデフォルトになります。

一方matchingはリモートで同じ名前を持つallブランチをローカルにプッシュします。 (あなたの現在の作業ブランチに関係なく)。これは、あなたが共有さえしたくないかもしれないものを含む、潜在的に多くの異なるブランチがプッシュされることを意味します。

私の個人的な用法では、私は一般的に異なるオプションを使います:現在の作業ブランチをプッシュするcurrent(私はいつもどんな変更のためにも分岐するので)。しかし初心者のために私はsimpleを提案したいと思います

Push.default
refspecが明示的に与えられていない場合にgit Pushが取るべきアクションを定義します。特定のワークフローには異なる値が適しています。たとえば、純粋に集中的なワークフロー(つまり、フェッチ元がプッシュ先に等しい)では、アップストリームがおそらく必要なものです。可能な値は次のとおりです。

何もない - refspecが明示的に与えられていない限り、何もプッシュしない(エラー出力)これは主に常に明示的であることによって間違いを避けたい人のためのものです。

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

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

単純 - 集中型ワークフローでは、上流のブランチの名前がローカルのものと異なる場合は、プッシュを拒否するための安全性を追加して、上流のように作業します。

通常引っ張っているリモコンとは異なるリモコンに押すときは、現在のものとして動作します。これは最も安全なオプションであり、初心者に適しています。

このモードはGit 2.0ではデフォルトになるでしょう。

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

このモードを効果的に使用するには、git Pushを実行する前に、push outするすべてのブランチがプッシュされる準備ができていることを確認する必要があります。すべてのブランチを一度にプッシュできるようにするためです。他のブランチが未完成の状態で、通常1つのブランチだけで作業を終えて結果をプッシュするのであれば、このモードは役に立ちません。また、このモードは他の人がそこに新しいブランチを追加したり、あなたのコントロールの外で既存のブランチの先端を更新するかもしれないので、共有された中央リポジトリにプッシュするのには適していません。

現在これがデフォルトですが、Git 2.0ではデフォルトが単純に変更されます。

88
UpAndAdam

Git v2.0リリースノート

後方互換性に関するメモ

git Push [$there]がPushの意味を述べていないときは、これまでのところ "マッチング"セマンティクスを使いました(すでに同じ名前のブランチがある限り、すべてのブランチはリモートに送られました)。 Git 2.0では、デフォルトは "単純な"セマンティクスになりました。

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

  • 同じ名前のブランチへの現在のブランチのみです。リモートにプッシュしているのであれば、通常そこからは取り出していません。

これを変更するには、構成変数 "Push.default"を使用できます。あなたが "マッチング"セマンティクスを使い続けたい古いタイマーであれば、例えば "マッチング"に変数を設定することができます。他の可能性については文書を読んでください。

コマンドラインで追加するパスを指定せずにgit add -uおよびgit 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>と言うことができます。

2
CodeWizard