0

私のローカル git リポジトリには、次のようなコミット構造があります。

                              branch-feature1
                                 |
               |-> commit3 -> commit4
               |
 commit1 -> commit2
               |
               |-> commit5 -> commit6
                                 |
                              branch-feature2

1) を実行するとgit push remote branch-feature1、commmit5 と commit6 は除外され、commit1 から commit4 までのコミットのみがリモート リポジトリに同期されると考えるのは正しいですか?

2) ここで、上記と同じコミット構造がリモート リポジトリにあるとします。「git fetch remote」を実行すると、6 つのコミットすべてがローカル リポジトリに同期されると考えるのは正しいですか?

4

1 に答える 1

3

1)あなたの仮定は正しいです。commit5 と 6 は で除外されgit push remote branch-feature1ます。すべてのトラッキング ブランチをプッシュすることもできますがgit push remote :(以前はこれがデフォルトでした)、それは危険です。その理由を説明します。

これを想像してみてください: いくつかの新しいコミットが master に表示されている間、あなたは喜んで自分のブランチに取り組んでいます。コミットを修正する必要があると判断したため、 でプッシュを強制する必要がありますgit push -f。以前は、デフォルトで git がすべての追跡ブランチをプッシュしていたので、最新の更新で他のブランチを早送りしなかった場合、マスターをローカルのバージョンにロールバックすることになります。マスターがいた!これは明らかに悪い状況であるため、人々にとって危険性が少なくなるようにデフォルトが変更されました。

デフォルトとは異なるポリシーを設定することができます。マニュアルページを見てpush.defaultください。git-configまた、プッシュはデフォルトで fetch refspec を使用しますが、別のものを選択することもできます。remote.<name>.push同じ man ページを参照してください。

2) はい、すべてのコミットはローカルに戻され、同じようにbranch-feature1なります。つまり、フェッチに使用されている refspec を変更したり、プッシュ refspec を設定したりしていない限り。デフォルトから変更すると便利な場合があります。たとえば、オープン ソース プロジェクトに取り組んでいるとき、私は通常、自分のフォークを に置き、実際のプロジェクトを に置きます。私はしばしばwithからブランチを取るだけです:refs/remotes/<remote>/branch-feature1branch-feature2originupstreammasterupstream

[remote.upstream.fetch]
    fetch = +refs/heads/master:refs/heads/upstream/master
于 2013-08-17T09:35:35.217 に答える