14

私はgitを初めて使用し、簡単なfetch操作で問題が発生します。

同僚の進捗状況を彼のリポジトリから取得しようとしています。最初はgit fetch HEAD、gitに約350MBのデータをダウンロードするように促したので、何かが行われたと確信していました。しかし、origin/masterそれでも同じ古いコミットを指すことになりました(実際には名前の下にありdevますが、私はそれを呼び出しますmaster-彼は持っていませんmaster)。

その後試してみgit fetch origin masterましたが、何も起こらなかったようで、更新されただけFETCH_HEADです。コミットを失わないようにタグを付けましたFETCH_HEADが、リモートブランチを更新したいと思います。

何が悪かったのですか?リモートリポジトリにアクセスできません。それでも自宅で修理できますか?

4

4 に答える 4

18

私はあなたが使うコマンドに少し混乱しています。 HEAD通常、gitが現在作業ディレクトリにあるコミットを追跡するために使用するラベルです。このgit fetchコマンドは、リモートまたはリモートのコミット構成が何をフェッチするかを認識していることを前提としています。を使用すると、リポジトリ内のリモートgit fetch HEADが示されます。HEADコマンドがエラーなしで機能したことは不思議です。

例: git fetch HEADリポジトリで現在作業していると、次のエラーが発生します

fatal: 'HEAD' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

このコマンドgit remoteはすべてのリモートを一覧表示しgit remote --verbose、リモートのアドレスを含めます。これを使用して、リモートが定義されているかどうか、HEADおよびどのリモートが友達リポジトリにアドレス指定されているかを確認できますか?

しかし、私の質問はさておき、あなたの混乱を解消するのに役立ちます。このgit fetch ...コマンドは、リモート参照のみを更新します。ローカル参照は更新しません。

これを明確にするには、リポジトリの.gitフォルダーの内部を確認します(デフォルトでは非表示になっているため、再表示する必要がある場合があります)。次のようなフォルダ構造があります

working directory
|=>.git
|  |=>objects           <= contains data for each commit
|  |=>refs
|     |=>heads
|        |-master       <= file containing current commit of local master branch
|     |=>remotes
|        |=>origin
|           |-master    <= file containing current commit of remote origin's master branch
|-FETCH_HEAD            <= file updated by `git fetch`, contains info of what was fetched

マスターブランチをチェックアウトするgit checkout masterとします。--gitは、「。git / refs / heads/master」ファイルのコミット値と一致する「objects」フォルダーのコミットデータと一致するように作業ディレクトリを変更します。

その場合git fetch origin master、「。git / refs / remotes / origin / master」ファイルは、リモートオリジンのマスターブランチのコミットに更新されます。そのコミットに必要なすべてのコミットデータがダウンロードされ、「オブジェクト」に配置されます。フォルダ。

ここで重要な点はgit fetch、チェックアウトされたローカルブランチを反映して作業ディレクトリを更新せず、ローカルブランチをgit fetch更新しないことです。

の変更でローカルブランチを更新するには、またはのいずれgit merge ...かを使用する必要があります。 オプションと構成に応じて、とのいずれかまたはを実行します(デフォルト)。git rebase ...masterorigin/mastergit pull ...git fetch ...git merge ...git rebase ...git merge ...

そのすべての説明の後、友達のリポジトリから何が(もしあれば)フェッチされたかを確認できるようにしたいと思います。このgit branch -avvコマンドは、すべてのローカルブランチとリモートブランチをコミット番号とともに一覧表示し、ローカルブランチの場合は、追跡しているリモートブランチを一覧表示します。

ブランチが互いにどのように関連しているかを確認するには、ツールを使用してリポジトリツリーをグラフ化すると便利です。選択できるものはいくつかありますが、git logコマンドで十分だと思います。などgit log --all --graph --oneline --decorate。公正な警告です。これは非常に長く、大規模なリポジトリでは複雑になる可能性があります。--simplify-by-decoration引数を追加することで、より短い出力を得ることができます。

要約すると、自宅で修正できるかどうかは、リポジトリ内の情報によって異なります。上記のコマンド。git remote --verbosegit branch -avvおよびgit log ...リポジトリの現在の状態を理解できるようにする必要があります。git mergeそこから、またはを使用してローカルブランチのデータを取得するためにさらに何かを行う必要があるかどうかを判断できますgit rebase

いつものように、問題が発生した場合は、学んだことを投稿してください。

于 2013-02-23T20:46:23.870 に答える
15

git 1.8.4(2013年8月)以降git fetch、リモートトラッキングブランチを更新します!だけではありませんFETCH_HEAD

Jeff King()のcommitf269048を参照してください。peff

引数なしで通常の" git fetch"を実行すると、構成されたrefspecに従って追跡参照が更新されます。
ただし、 " git fetch origin master"(または " git pull origin master")を実行すると、構成されたrefspecはまったく表示されず、更新するだけFETCH_HEADです。

refs/remotes/origin/master" "(またはユーザーが構成したもの)を更新する機会を逃します。一部のユーザーは、次のように、リモートマスターの古い状態とさらに比較したいので、これを混乱させると感じています。

$ git pull origin master
$ git log HEAD...origin/master

ただし、ブランチをフェッチするようにリポジトリを設定していると仮定します。

git config remote.origin.fetch

空の場合:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
于 2014-01-07T08:51:07.217 に答える
5

git fetch実際には作業ディレクトリには触れません。リモートから最新の変更のみをフェッチします。現在の状態を実際に更新するには、git mergeまたはを使用しますgit rebase。また、+git pullへのショートカットのように機能するものを使用することもできます。git fetchgit merge

マージとリベースの主な違いは、場合によっては、マージによって、蓄積された状態(非早送りマージ)で新しいコミットが作成されることです。私がSVNを使用したときのことを思い出させるように、これは悪いことです。Rebaseは、指定されたコミットに加えて変更を再生するだけなので、履歴は常に線形です。必ず同僚と同じフローを使用してください。

git全般とgitflowに関するいくつかの記事を読むことをお勧めします必読の本良い記事です。

于 2013-02-22T20:26:44.893 に答える
1

あなたがしたいことは:

  • 同僚用のリモコンを追加します
  • 彼のリポジトリから変更を取得します
  • 彼のリモートブランチを参照するローカルブランチを作成します

おそらく、あなたはすでにステップ#1を完了しています。しかし、完全を期すために、それは次のとおりです。

git remote add coworker git://path/to/coworkers/repo.git

ここで、URLはgitがサポートする任意のURL形式にすることができます。

リモコンを追加したので、彼の変更を取得します。

git fetch coworker

これにより、彼のブランチごとにリモートブランチが提供されます。彼の枝が「ハムスター」と呼ばれているとしましょう。ここで、作業を行うために、リモートブランチの独自のローカルコピーを作成します

git checkout -b hamster coworker/hamster

これにより、ハムスターと呼ばれるブランチが作成され、切り替えられます。

その時点から、あなたはハムスターに取り組み、それを彼にプッシュすることができます

git push coworker hamster

初めて、そしてその直後git push

彼の変更をプルダウンしてマージしたいときはいつでも、次のことができます。

git pull

于 2013-02-24T13:52:03.123 に答える