私はGitを学び始めています。私はGitKrakenをいじり回してきましたが、GUIを使用することが、データを保存および共有するための実行可能なパスになることを願っています。コマンドラインよりもGUIの方が好きです。
これで、GUIで、ファイルをstage
、次にcommit
、次にPush
してアップロードする必要があることがわかりました。しかし、なぜPush
とcommit
が2つの異なるものなのですか?ファイルの同期を維持するために次のアップロードを行わずに、ローカルでcommit
だけにしたいのはなぜですか?
いくつかの(具体的な)理由。 太字のTLDR
最初の理由は、リモートにプッシュできない可能性があることですインターネットに接続していないためです。
2番目の理由は、コミットをプッシュする準備ができていない場合があることです。たとえば、私はTDDを練習しています。失敗したテストをコミットした後(私はそうします)、それをリモートにプッシュしたくありません。そうすると、チームが失敗したテストスイートをプルする可能性があるためです。もう1つの一般的な方法は、これらのコミットをプッシュする前に押しつぶして、機能が1つのコミットであるように見せることです。
番目の理由は、誰とも共有したくない個人的なプロジェクトであるためですしたがって、Pushtoのリモートはまったくありません。 gitリポジトリを備えたリモコンを用意する必要はありません。
4番目の理由は、複数のリモートがある可能性があることです(一般に、分散セマンティクスが邪魔になります)。それで、コミットした後、gitはどのリモートにプッシュしたいかをどのように知るのでしょうか?それらすべて?あるもの? 7つのうちの特定の2つ? gitは分散VCSであるため、プッシュはgitの観点から明示的である必要があります。詳細については、pokeの回答を参照してください。
P.S。これは質問のトピックから外れていますが、コマンドラインシェル(bashを含む)は、それらの使用法を学ぶと非常に強力なインターフェイスになります。これらのツールに習熟した後は、これらのツールの使用は、これから見つけるどのGUIよりもはるかに高速です。これは、マウスの代わりにキーストロークで強力なアクションを実行できること、およびニーズに合わせて無限にカスタマイズできることと関係があります。
Gitは分散バージョン管理システムです。そのため、SubversionやCVSのように、single中央リポジトリはありません。では、コミットしてプッシュするコマンドが1つあるとしたら、そのコミットはどこに行くのでしょうか。リモートリポジトリは何でしょうか?
Gitには、中央リポジトリはありません。リポジトリには階層すらありません。ローカルリポジトリの場合、any他のリポジトリは相互作用できるリモートリポジトリです。また、ローカルリポジトリは、他のリポジトリの可能なリモートリポジトリにすぎません。
したがって、ローカルとリモートは、現在の場所に対する単なる視点です。ローカルリポジトリは常に現在のリポジトリであり、他のすべてのリポジトリは、操作できるリモートです。
Gitを使用する場合、ローカルリポジトリは、対話するものです。すべての変更をローカルでコミットします。これには多くの利点とユースケースがありますが、ここでは詳しく説明しませんが、ローカルリポジトリにはすべての情報と完全な履歴があるため、基本的にバージョン管理が分散されます。
したがって、完全な履歴とすべての変更を含むローカルリポジトリがある場合、履歴を共有できるようにするために、他のリポジトリと対話する方法が必要です。そのための2つの方法は、プッシュとプル(またはフェッチ)です。分散リポジトリでは、すべてのリポジトリが同じであるため、すべてのリポジトリは別のリポジトリからプッシュまたはプルできます(アクセス権がある場合)。
結局、コミットとプッシュは別々のステップである必要があります。これは、一方が(ローカル)リポジトリと対話し、もう一方がリモートリポジトリと変更を共有するための意図的なステップであるためです。
それらは異なる目的を果たします。コミットごとに、コードの1つの孤立した側面を変更する必要があります。たとえば、変数の名前を変更したり、ある関数の呼び出しを別の関数の呼び出しに置き換えたり、コメントのタイプミスを修正したりできます。それらをロールバックポイントと考えてください。ここで採用したアプローチについて考えが変わった場合、コミットの小さなセットを削除しても、これらの他の無関係な変更を保持できますか?
プッシュは、一連のコミットが、同僚や共同作業者と共有するのに十分なテストが行われた開発の新しい安定したポイントに到達したときにのみ発生します。
作業している場合、コミットごとに1つのプッシュを行うことは不可能でも珍しいことでもありません。マイナーなバグの修正について。しかし、多くの場合、より大きな目標に向かって進むときに個々の変更をコミットし、その目標に到達したと思ったときにのみプッシュするのが理にかなっています。