1

私の理解git addは、あなたは基本的にローカルの git リポジトリに「はい、これらの変更を行いたいと確信しています」と言っているということです。

私の理解git commitは、実際に変更をローカルの HEAD ブランチに保存することです。この時点で、それらは実際にはバージョン管理されていますが、git のインスタンスに対してのみローカルです。

私の理解git pushは、保存された (コミットされた) 変更をマスター リポジトリに反映させることで、他の開発者 (またはおそらく CI ビルド) が自分でそれらをプルダウンできるようになります。

これまでの私の発言が間違っていたり、誤解を招いたりしている場合は、まず訂正してください。私の理解が正しいと仮定すると、もともとJavaプロジェクトに次のようなパッケージがありました。

com.myapp.server.servlets
    FizzServlet
    BuzzServlet

しかし、その後、いくつかの新しいファイル/パッケージを追加および削除するだけでなく、名前といくつかのものをリファクタリングすることにしました。

com.myapp.server.servlet
    FizzesServlet
    WidgetServlet
    com.myapp.server.servlet.impl
        FizzesServletImpl
        WidgetServletImpl

全体として、このディレクトリには 5 つの変更が加えられています。

  1. com.myapp.server.servlets名前を「 」から「 com.myapp.server.servlet」に変更しました
  2. FizzServlet名前を「 」から「 FizzesServlet」に変更しました
  3. BuzzServletまるごと削除
  4. 新たに追加WidgetServlet
  5. com.myapp.server.servlet.impl2 つの子ファイルを含む新しいパッケージを追加しました

ここで特別なコマンド マジックを実行する必要がありgit push *ますか? SVN Eclipse プラグインで、パッケージまたはソース ファイルの名前を変更し、その変更をコミットしようとすると、ファイルが完全に (ローカルで) 失われ、ローカル履歴から復元する必要がありました。それでも数え切れないほど火傷を負い、多くの仕事を失いました。Git で同じような経験をしないことを願っています。

4

1 に答える 1

2

プッシュすることに非常に注意を払っている方法から、あなたの理解はgit push完全ではありません。push文字通り、コミットをリモートにプッシュするだけです。つまり、最後のプッシュ以降に行ったコミットで保存した正確な状態をコピーします。Git では、すべてのコミットはリポジトリ内のすべてのファイルのスナップショットです (実際には、変更だけでなく、すべてのファイルが記録されます)。したがって、コミット後にローカルで表示されるものは、プッシュ時にリモートにコピーされたものとまったく同じになります。

プッシュすると、次の 2 つのいずれかが発生します。

  1. プッシュが成功した場合、すべてが正常で、リモートの状態がローカル リポジトリの状態をミラーリングします (これを強調するために、git コミットは SHA ハッシュによって識別されることを思い出してください。コミットが異なる場合は、ハッシュも異なります。なれ)
  2. 早送りではないため、プッシュは拒否されます。これは、あなたが最後にプル/フェッチしてから、他の誰かがあなたのリモートにコミットをプッシュした場合に発生します。これは、SVN でコミットしようとするときの厄介でしばしば恐れられる競合に相当します。ただし、ローカルの状態はこれによる影響を受けません。競合を解決する必要があります (a) コミットをドロップしてリモートの状態を受け入れる (git resetこれには が使用されます)、またはリモートからフェッチし、(b) ローカルの変更をマージして、それによってマージ コミットを作成します。履歴の発散と再収束、または (c) リモートにリベースして線形履歴を生成します。

競合解決のケースについてはもう少し調査が必要ですが、必要なアクションについては Pro Git の本 (Branching、Merging、Rebasing の章) で詳しく説明されています。

他の誰かがあなたのリモートにプッシュできる場合、または別のコンピューターからリモートにプッシュした場合にのみ、競合が発生する可能性があります。単一ユーザー、単一コンピューターのシナリオで作業している場合 (少なくとも現時点では)、プッシュ時に競合は発生しません。

于 2013-02-05T18:02:25.570 に答える