7

リポジトリのURLからGitクローンを作成したとします。ファイルにいくつかの変更を加え、Gitコミットを行いました。

を実行するgit pullと、「すでに最新です」と表示されていることがわかります。

私が最新ではないということを示すべきではありませんか?

私の質問は:

  1. 上記の変更をローカルリポジトリに行ったが、2日間コミットしないと言いますが、2日が経過する前に、他の誰かがリモートリポジトリに変更を加えました。リモートリポジトリの変更を上書きしないようにするため、または少なくともコミットする前に最新の変更をプルできるようにするには、どのような手順を実行する必要がありますか?

  2. ローカルリポジトリとリモートリポジトリを比較して、どのような違いがあるかを確認する方法はありますか?(以前に持っていたものを思い出したい場合は?)

4

2 に答える 2

12

私の最初のアドバイスは、しないことgit pullです。a のgit fetch後に a を実行しgit mergeます。

あなたのゼロ番目の質問に答えるには:実際、あなた最新です。リモート リポジトリにあるすべてのコミットがあります。したがって、フェッチまたはマージするものは何も残っていません1

最初の質問に答えるには:

  1. git commit: 変更を自分のブランチにコミットします。リモート リポジトリで起こっていることとはまったく関係ありません。
  2. git fetch origin: リモート リポジトリ ( ) のコンテンツを取得しますが、ブランチoriginの下に保持します。origin/branchこの時点では、独自のコードは影響を受けません。
  3. git merge origin/master:リモート リポジトリorigin/masterのブランチ(今フェッチしたもの) を現在のブランチとマージします。masterorigin
  4. git push origin: コミットとマージをリモート リポジトリにプッシュ バックします。

2 番目の質問に答えるには:

  1. git fetch originorigin/branch:ブランチを更新します。
  2. git diff origin/master: 現在のブランチとブランチの違いを取得しますorigin/master

1これが、あなたのリポジトリのコミットがブランチ上で最初にどのように見えるかを仮定しますmaster:

A -> B -> C -> D -> E
                    |
                    |\- master
                    |
                     \- origin/master

これは、リポジトリをクローンした直後です。これで、ローカル ブランチで新しいコミットを作成したとしますmaster

A -> B -> C -> D -> E -> F
                    |    |
                    |     \- master
                    |
                     \- origin/master

したがって、ここで注意すべき点が 2 つあります。

  1. リモートで他の誰かによるアクティビティがないと仮定すると、origin取得する新しいものは何もありません。つまりgit fetch origin master、新しいものは何もないということです。

  2. もう一度実行するとgit merge origin/master、マージするものは何もありません。origin/masterプレフィックスですmaster。つまり、master既にすべてのコミットが含まれているorigin/masterため、マージする新しいものは何もありません。

の代わりにfetchandを使用した場合、ダブル コマンド ( ) のどの部分が予期しない (あなたの意見では) 動作を引き起こすのかを簡単に理解できます。mergepullpull

もちろん、 の後git push origin master、次のようになります。

A -> B -> C -> D -> E -> F
                         |
                         |\- master
                         |
                          \- origin/master
于 2012-11-13T17:05:48.757 に答える
4

プルすると、サーバーから履歴が取り込まれ、他の人が変更したものとあなたが変更したものを自動的にマージしようとします。自動的に実行できる場合は成功し、何も表示されません。失敗した場合は、競合を修正するよう求められます。他の人が行った変更を黙ってオーバーライドすることはできません。

誰かが何かを変更したかどうかを確認したい場合は、これを実行しgit fetchてからgit status. ステータスには、ローカルで変更されたファイルが表示されますが、「Your branch is 2 commits ahead of origin/master」のようなメッセージも表示されます。これは、サーバーにプッシュされていないコミットが 2 つあることを意味します。他の誰かがサーバーにもプッシュした場合、「あなたのローカル ブランチとオリジン/マスターが分岐しました。これは、あなたと他の誰かの両方がマスターにコミットしたことを意味し、プルするとそれらをマージしようとします。 、 上記のように。

于 2012-11-13T16:55:38.933 に答える