8

特定のブランチでのコミットがどのように機能するかを明確にしたいだけです。

「Metro」というブランチに取り組んでいるとしましょう。いくつかのファイルに変更を加えましたが、これらをリモート リポジトリにプッシュする準備ができていません。

早急に修正する必要があるホットフィックスが届きました。「Master」という名前のクリーンなブランチに切り替える必要がありますが、変更したファイルを上書きしてしまうためできません。切り替える前に、これらをコミットする必要があります。

私の質問は、「Metro」ブランチでこれらの変更をコミットしてから、クリーンな「Master」ブランチに切り替えた場合、「Metro」で行われた変更はリモートの「Master」リポジトリにプッシュされますか?私は別のブランチにプッシュしていますが?

簡潔にするために、コミットはブランチに分離されていますか、それともリモートリポジトリにプッシュするときにすべてのコミットが追加されますか?

4

3 に答える 3

3

ブランチを 経由git checkout masterで master に切り替える前に、最初に を実行する必要がありますgit commit -m 'some message'。そうしないと、git は現在のブランチの変更を master ブランチに持ち込もうとします。

「メトロ」で行われた変更は、別のブランチにプッシュしているにもかかわらず、コミットしたため、リモートの「マスター」リポジトリにプッシュされますか?

絶対違う。git は、コミットされた変更Metroを master にマージするように指示した場合にのみマージします。これは仕様によるものです (注: git リモートについてお読みください。リモートを使用すると、プッシュを実際に「デフォルト」で設定できるため、注意が必要な場合があります)。

于 2013-02-27T17:20:23.787 に答える
2

簡潔にするために、コミットはブランチに分離されていますか、それともリモートリポジトリにプッシュするときにすべてのコミットが追加されますか?

簡潔にするために: 最初の部分ははい :-)。

技術的に言えば、git のブランチは名前を伴う一連のコミットです。ブランチをプッシュすると、それに属するすべてのコミットがプッシュされますが (リモート リポジトリに既にコミットされている場合を除く)、他には何もありません。いいえ、gitはどういうわけかすべてのコミットをプッシュしません。

ただし、プッシュしたいブランチのみをプッシュするように注意する必要があることに注意してください。すべてgit pushのブランチをプッシュするように構成できます。これを回避するには、config var push.default を設定します。

git config push.default current

これによりgit push、現在のブランチのみがプッシュされるようになります (以前はデフォルトであったすべてのブランチではありません)。

于 2013-02-27T17:23:30.933 に答える
1

Git でブランチがどのように機能するかを理解するには、常にコミット ツリーを念頭に置くように考え方を変えることが重要だと思います。各コミットには多数の親コミットがあり、他には何もないコミットの非循環ツリーがあります。ブランチは、そのツリー内の特定のコミットへの単純なポインターになりました。ブランチに新しいコミットを作成すると、実際には、以前のバージョンを親として持つ変更を含む新しいコミット オブジェクトを作成し、ブランチ ポインターがツリー全体に追加された新しいコミットに移動するだけです。 .

したがって、ブランチは互いに完全に独立しており、同様に、あまり意味がありません。それらは単なるポインタです。

あなたの場合、 からmetroに切り替えるとmaster、(おそらく) ツリーの別の側で操作しています。ここで作成するすべてのコミットは、現在のブランチ ポインター (master) のみを移動しますが、他のブランチには影響しません。

ブランチをプッシュすると、リモートにブランチが指しているコミットを伝えてから、ツリーを完成させるために必要なすべてのオブジェクトをリモートに渡すだけです。

于 2013-02-27T17:23:20.067 に答える