5140
18398
この投稿を改善したいですか?引用や回答が正しい理由の説明など、この質問に対する詳細な回答を提供してください。詳細が不十分な回答は、編集または削除される場合があります。
gitpullとgitfetchの違いは何ですか? 
1
2
次
簡単に言うと、gitpullはgitfetchを実行し、続いてgitmergeを実行します。
いつでもgitfetchを実行して、refs / remotes /  /の下にあるリモートトラッキングブランチを更新できます。
この操作は、ref / headsの下にある独自のローカルブランチを変更することはなく、作業コピーを変更せずに安全に実行できます。バックグラウンドでcronジョブで定期的にgitfetchを実行している人のことも聞いたことがあります(ただし、これを行うことはお勧めしません)。
git pullは、ローカルブランチをリモートバージョンで最新の状態にすると同時に、他のリモートトラッキングブランチを更新するために行うことです。
git pullのGitドキュメントから:
デフォルトモードでは、gitpullはgitfetchの省略形であり、その後にgit mergeFETCH_HEADが続きます。
|
プルを使用すると、Gitは自動的に作業を実行しようとします。コンテキストに依存するため、Gitはプルされたコミットを現在作業中のブランチにマージします。プルは、最初にコミットを確認しなくても、コミットを自動的にマージします。ブランチを厳密に管理しないと、頻繁に競合が発生する可能性があります。
フェッチすると、Gitは現在のブランチに存在しないターゲットブランチからコミットを収集し、ローカルリポジトリに保存します。ただし、それらを現在のブランチとマージすることはありません。これは、リポジトリを最新の状態に保つ必要があるが、ファイルを更新すると壊れることがある何かに取り組んでいる場合に特に便利です。
コミットをマスターブランチに統合するには、mergeを使用します。
|
gitの設計哲学をSVNのようなより伝統的なソース管理ツールの哲学と対比することが重要です。
Subversionは、クライアント/サーバーモデルを使用して設計および構築されました。サーバーである単一のリポジトリがあり、複数のクライアントがサーバーからコードをフェッチして作業し、サーバーにコミットして戻すことができます。クライアントは、操作を実行する必要があるときにいつでもサーバーに接続できることを前提としています。
Gitは、中央リポジトリを必要とせずに、より分散されたモデルをサポートするように設計されています(ただし、必要に応じて確実に使用できます)。また、gitは、クライアントと「サーバー」が同時にオンラインである必要がないように設計されています。 Gitは、信頼性の低いリンク上の人々が電子メールを介してコードを交換できるように設計されています。完全に切断された状態で作業し、CDを書き込んでgit経由でコードを交換することができます。
このモデルをサポートするために、gitはコードを含むローカルリポジトリと、リモートリポジトリの状態をミラーリングする追加のローカルリポジトリを維持します。リモートリポジトリのコピーをローカルに保持することで、gitは、リモートリポジトリに到達できない場合でも、必要な変更を把握できます。後で他の誰かに変更を送信する必要がある場合、gitは、リモートリポジトリに認識されている時点からの変更のセットとしてそれらを転送できます。
git fetchは、「リモートリポジトリのローカルコピーを最新の状態にする」というコマンドです。
git pullは、「リモートリポジトリの変更を自分のコードを保持する場所に持ってくる」と言っています。
通常、git pullは、git fetchを実行してリモートリポジトリのローカルコピーを最新の状態にし、変更を独自のコードリポジトリと場合によっては作業コピーにマージすることでこれを行います。
ワークステーションにはプロジェクトのコピーが少なくとも3つあることが多いことを覚えておいてください。 1つのコピーは、独自のコミット履歴を持つ独自のリポジトリです。 2番目のコピーは、編集および作成している作業コピーです。 3番目のコピーは、リモートリポジトリのローカルの「キャッシュされた」コピーです。
|
これは、すべてがどのように組み合わされているかについてのオリバー・スティールのイメージです。
十分な関心があれば、画像を更新してgitcloneとgitmergeを追加できると思います...
|
git fetchのユースケースの1つは、最後のプル以降のリモートブランチの変更を以下に示すことです。したがって、実際のプルを実行する前に確認できます。これにより、現在のブランチと作業コピーのファイルが変更される可能性があります。
git fetch
git diff ... origin
diffコマンドの二重ドットおよび三重ドット構文については、https://git-scm.com/docs/git-diffを参照してください。
|
何が違うのか理解するのに少し費用がかかりましたが、これは簡単な説明です。ローカルホストのマスターはブランチです。
リポジトリのクローンを作成すると、リポジトリ全体がローカルホストにフェッチされます。これは、その時点で、HEADへのオリジン/マスターポインターと同じHEADを指すマスターがあることを意味します。
作業を開始してコミットを実行すると、マスターポインタをHEAD +コミットに進めます。ただし、オリジン/マスターポインターは、クローンを作成したときの状態を示しています。
したがって、違いは次のようになります。
git fetchを実行すると、リモートリポジトリ(GitHub)内のすべての変更がフェッチされ、オリジン/マスターポインタがHEADに移動します。その間、ローカルブランチマスターはそれがどこにあるかを指し続けます。
git pullを実行すると、基本的に(前に説明したように)フェッチが実行され、新しい変更があればマージされます。マスターブランチを作成し、ポインタをHEADに移動します。
|
視覚的な表現が役立つ場合があります。
|
簡単に
git fetchはpullに似ていますが、マージされません。つまり、リモート更新(参照とオブジェクト)をフェッチしますが、ローカルは同じままです(つまり、オリジン/マスターは更新されますが、マスターは同じままです)。
git pullはリモートからプルダウンし、即座にマージします。
もっと
gitcloneはリポジトリのクローンを作成します。
git rebaseは、アップストリームブランチにない現在のブランチから一時的な領域にデータを保存します。これで、ブランチは変更を開始する前と同じになります。したがって、git pull -rebaseはリモートの変更をプルダウンし、ローカルブランチを巻き戻し、最新になるまで現在のブランチの上で変更を1つずつ再生します。
また、git branch -aは、ローカルとリモートのすべてのブランチで何が起こっているかを正確に示します。
このブログ投稿は役に立ちました:
git pull、git fetch、git clone(およびgit rebase)の違い-Mike Pearce
git pull、git fetch、git clone、gitrebaseについて説明しています。
====
更新
実際にこれをどのように使用するかを示すために、これを更新すると思いました。
リモートからローカルリポジトリを更新します(ただし、マージしないでください)。
git fetch
アップデートをダウンロードしたら、違いを見てみましょう。
gitdiffマスターオリジン/マスター
これらの更新に満足している場合は、以下をマージします。
git pull
ノート:
ステップ2:ローカルとリモートの差分の詳細については、ローカルのgitブランチをそのリモートブランチと比較する方法を参照してください。
ステップ3:ここでgit rebase originを実行する方がおそらくより正確です(たとえば、急速に変化するリポジトリで)。別の回答の@JustinOhmsコメントを参照してください。
参照:http://longair.net/blog/2009/04/16/git-fetch-and-merge/
|
git-pull-別のリポジトリまたはローカルブランチからフェッチしてマージします
概要
gitpull…
説明
指定されたパラメーターを使用してgit-fetchを実行し、git-mergeを呼び出して
現在のブランチにヘッドを取得しました。 --rebaseを使用して、git-rebaseを呼び出します
git-mergeの代わりに。
を使用できることに注意してください。 (現在のディレクトリ)プルする<リポジトリ>として
ローカルリポジトリから—これはローカルブランチをマージするときに役立ちます
現在のブランチに。
また、git-pull自体と基礎となるgit-mergeを対象としたオプションにも注意してください
git-fetch用のオプションの前に指定する必要があります。
履歴をマージしたい場合はプルし、誰かがこのあたりの記事にタグを付けているので、「codezが必要な場合」にフェッチします。
|
リモートリポジトリからフェッチし、違いを確認してから、プルまたはマージすることができます。
これは、originと呼ばれるリモートリポジトリと、リモートブランチのorigin / masterを追跡するmasterと呼ばれるブランチの例です。
gitチェックアウトマスター
git fetch
git diff origin / master
git rebase origin master
|
短くて簡単な答えは、gitpullは単にgitfetchとそれに続くgitmergeであるということです。
git pullは、気に入るかどうかに関係なく自動的にマージされることに注意することが非常に重要です。もちろん、これによりマージの競合が発生する可能性があります。リモートがオリジンで、ブランチがマスターであるとしましょう。プルする前にdifforigin / masterをgitする場合は、潜在的なマージの競合についてある程度の考えがあり、それに応じてローカルブランチを準備できます。
プルとプッシュに加えて、一部のワークフローには、リンクされた記事から言い換えると、このようなgitリベースが含まれます。
git pull origin master
git checkout foo-branch
gitリベースマスター
git push originfoo-branch
このような状況に陥った場合は、git pull--rebaseを使用したくなるかもしれません。あなたが本当に、あなたが何をしているのかを本当に知っていない限り、私はそれに対して忠告します。この警告は、git-pullバージョン2.3.5のマニュアルページからのものです。
これは潜在的に危険な操作モードです。書き直します
あなたがその歴史を発表したとき、それは良い前兆ではありません
既に。 git-rebase(1)を読んでいない限り、このオプションを使用しないでください
慎重に。
|
OK、ここにgitpullとgitfetchに関するいくつかの情報があるので、実際の違いを理解できます...簡単に言えば、fetchは最新のデータを取得しますが、コードの変更はなく、現在のローカルブランチコードを台無しにすることはありません、ただし、コードの変更をプルしてローカルブランチにマージし、それぞれの詳細を取得するために読んでください。
git fetch
すべての参照とオブジェクト、および新しいブランチをローカルリポジトリにダウンロードします...
1つ以上のブランチおよび/またはタグ(総称して「refs」)をフェッチします
他のリポジトリと、それらを完了するために必要なオブジェクト
歴史。リモートトラッキングブランチが更新されました(説明を参照)
この動作を制御する方法については、以下を参照してください)。
デフォルトでは、フェッチされている履歴を指すタグはすべて
また、フェッチされました。その効果は、ブランチを指すタグをフェッチすることです。
このデフォルトの動作は、を使用して変更できます。
--tagsまたは--no-tagsオプションを設定するか、
remote..tagOpt。タグを明示的にフェッチするrefspecを使用することにより、
興味のあるブランチを指していないタグをフェッチできます
同様に。
gitfetchはからフェッチできます単一の名前付きリポジトリまたはURL、または
与えられ、ある場合、一度に複数のリポジトリから
リモコン。構成ファイルのエントリ。 (git-config1を参照)。
リモートが指定されていない場合、デフォルトでは、元のリモートは次のようになります。
現在のブランチ用に構成されたアップストリームブランチがない限り、使用されます
ブランチ。
フェッチされる参照の名前とオブジェクト名
それらはポイントし、.git / FETCH_HEADに書き込まれます。この情報は
スクリプトまたはgit-pullなどの他のgitコマンドで使用されます。
git pull
リモートからローカルの現在のブランチへの変更を適用します...
リモートリポジトリからの変更を現在のブランチに組み込みます。
デフォルトモードでは、gitpullはgitfetchの省略形であり、その後に
gitマージFETCH_HEAD。
より正確には、git pullは、指定されたパラメーターを使用してgitfetchを実行します。
git mergeを呼び出して、取得したブランチヘッドを現在のブランチヘッドにマージします
ブランチ。 --rebaseを使用すると、gitmergeの代わりにgitrebaseを実行します。
に渡されるリモートリポジトリの名前である必要があります
git-fetch1。任意のリモート参照に名前を付けることができます(たとえば、
タグの名前)または対応する参照のコレクション
リモートトラッキングブランチ(例:refs / heads /:refs / remotes / origin /)、
ただし、通常はリモートリポジトリ内のブランチの名前です。
およびのデフォルト値は、
によって設定された現在のブランチの「リモート」および「マージ」構成
git-branch--track。
また、以下のビジュアルを作成して、gitfetchとgitpullがどのように連携するかを示します...
|
このインタラクティブなグラフィック表現は、gitを理解するのに非常に役立ちます:http://ndpsoftware.com/git-cheatsheet.html
git fetchは、リモートからローカルリポジトリに変更を「ダウンロード」するだけです。 git pullは変更をダウンロードし、現在のブランチにマージします。 「デフォルトモードでは、gitpullはgitfetchの省略形で、その後にgit mergeFETCH_HEADが続きます。」
|
ボーナス:
上記の回答でプル&フェッチについて言えば、興味深いトリックを共有したいと思います。
git pull --rebase
上記のコマンドは、多くの時間を節約した私のgitlifeで最も便利なコマンドです。
新しいコミットをサーバーにプッシュする前に、このコマンドを試してください。これにより、最新のサーバー変更が自動的に同期され(フェッチとマージを使用)、コミットがgitログの一番上に配置されます。手動のプル/マージについて心配する必要はありません。
詳細については、http://gitolite.com/git-pull--rebaseをご覧ください。
|
私はこれらのことを把握するために状況を視覚的に表現するのが好きです。たぶん他の開発者もそれを見たいので、ここに私の追加があります。すべてが正しいかどうかはわかりませんので、間違いを見つけたらコメントしてください。
ローカルシステム
。 ================================================== ===
=================。 ================= =================== =============
REMOTEREPOSITORY。 REMOTE REPOSITORY LOCAL REPOSITORY WORKING COPY
(ORIGIN)。 (キャッシュ)
例えば、      。の鏡
githubリポジトリ。 。リモートリポジトリ
することもできます。
複数のレポ。
。
。
フェッチ* ------------------> *
リモートのローカルキャッシュがオリジン(または複数)で更新されます
外部ソース、つまりgitの分散型)
。
引く   * -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - --------> *
変更はローカルコピーに直接マージされます。競合が発生した場合、
あなたは決定を求められます。
。
コミット。 * <--------------- *
たとえば、Subversionから来る場合、コミットと考えるかもしれません
原点を更新します。 gitでは、コミットはローカルリポジトリに対してのみ行われます。
。
プッシュ* <--------------------------------------- *
変更を元の場所に同期します。
リモートのフェッチされたミラーを持つことのいくつかの主な利点は次のとおりです。
パフォーマンス(ネットワークを介してスクイーズしようとせずに、すべてのコミットとメッセージをスクロールします)
ローカルリポジトリの状態に関するフィードバック(たとえば、AtlassianのSourceTreeを使用すると、オリジンと比較してコミットが進んでいるか遅れているかを示す電球が表示されます。この情報はGIT FETCHで更新できます)。
|
私もこれに苦労しました。実際、私はまったく同じ質問のグーグル検索でここに着きました。これらすべての回答を読んで、ようやく頭の中に絵が描かれました。2つのリポジトリと1つのサンドボックスの状態と、それらのバージョンを見ながら実行されたアクションを見て、これを理解しようと決心しました。これが私が思いついたものです。どこかでめちゃくちゃになったら訂正してください。
フェッチを伴う3つのリポジトリ:
--------------------- ----------------------- ------ -----------------
-リモートリポジトリ----リモートリポジトリ----リモートリポジトリ-
----プッシュされます----
-@ R01 --- @ R02 --- @ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------------------------------
-ローカルリポジトリ----ローカルリポジトリ----ローカルリポジトリ-
-プル--------フェッチ-
-@ R01 --- @ R01 --- @ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
-ローカルサンドボックス----ローカルサンドボックス-ローカルサンドボックス-
-チェックアウト----新しい作業が完了しました----
-@ R01 --- @ R01 + --- @ R01 +-
--------------------- ----------------------- ------ -----------------
プル付きの3つのレポ
--------------------- ----------------------- ------ -----------------
-リモートリポジトリ----リモートリポジトリ----リモートリポジトリ-
----プッシュされます----
-@ R01 --- @ R02 --- @ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
-ローカルリポジトリ----ローカルリポジトリ----ローカルリポジトリ-
-プル--------プル-
-@ R01 --- @ R01 --- @ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
-ローカルサンドボックス----ローカルサンドボックス-ローカルサンドボックス-
-チェックアウト----新しい作業が完了しました--R02と統合されました-
-@ R01 --- @ R01 + --- @ R02 +-
--------------------- ----------------------- ------ -----------------
これは、フェッチが非常に重要である理由を理解するのに役立ちました。
|
GITフェッチとGITプルの違いは、次のシナリオで説明できます。
(写真は言葉よりも雄弁であることを念頭に置いて!、私は絵の表現を提供しました)
チームメンバーと一緒にプロジェクトに取り組んでいる例を見てみましょう。したがって、プロジェクトのメインブランチが1つあり、すべての寄稿者はそれを自分のローカルリポジトリにフォークし、このローカルブランチで作業してモジュールを変更/追加してから、メインブランチにプッシュバックする必要があります。
そう、
ローカルリポジトリでメインプロジェクトをフォークしたときの2つのブランチの初期状態は次のようになります-(A、B、Cはプロジェクトですでに完了したモジュールです)
これで、新しいモジュール(Dを想定)の作業を開始し、Dモジュールを完了したら、それをメインブランチにプッシュします。しかし、その間に、チームメートの1人が新しいモジュールE、F、および変更されたC。
そのため、ローカルリポジトリがプロジェクトの元の進行状況に欠けているため、変更をメインブランチにプッシュすると、競合が発生し、モジュールDが誤動作する可能性があります。
このような問題を回避し、プロジェクトの当初の進捗状況と並行して作業するには、次の2つの方法があります。
1. Git Fetch-これにより、ローカルブランチに存在しない、オリジン/メインブランチプロジェクトに加えられたすべての変更がダウンロードされます。そして、Gitマージコマンドがリポジトリまたはブランチにフェッチされた変更を適用するのを待ちます。
だから今あなたは慎重にそれをリポジトリにマージする前にファイルを監視することができます。また、変更されたCのため、必要に応じてDを変更することもできます。
2. Git Pull-これにより、ローカルブランチがオリジン/メインブランチで更新されます。つまり、実際には、GitFetchとGitマージが次々に組み合わされます。
ただし、これにより競合が発生する可能性があるため、クリーンコピーでGitPullを使用することをお勧めします。
|
私たちは単に言う:
git pull == git fetch + git merge
git pullを実行する場合、データをローカルにマージする必要はありません。 git fetchを実行する場合は、ローカルマシンに最新のコードを取得するためにgitmergeを実行する必要があることを意味します。そうしないと、ローカルマシンコードはマージせずに変更されません。
そのため、Git Guiでは、フェッチするときにデータをマージする必要があります。 Fetch自体は、ローカルでコードを変更しません。フェッチしてコードを更新するときに確認できます
一度フェッチして見てください。変更されないコード。次にマージします...変更されたコードが表示されます。
|
git fetchは、リモートサーバーからローカルリポジトリのトラッキングブランチにコードをプルダウンします。リモートの名前がorigin(デフォルト)の場合、これらのブランチはorigin /内にあります。たとえば、origin / master、origin / mybranch-123などです。これらは現在のブランチではなく、サーバーからのブランチのローカルコピーです。 。
git pullはgitフェッチを実行しますが、トラッキングブランチのコードを現在のブランチにマージしますそのブランチのローカルバージョン。その変更の準備がまだできていない場合は、最初にgitfetchを実行してください。
|
git fetchはリモートブランチを取得するので、gitdiffまたはgitマージして現在のブランチにできます。 git pullは、現在のブランチによって追跡されているリモートブランチでフェッチを実行し、結果をマージします。 git fetchを使用すると、ローカルブランチとマージする必要なしに、リモートブランチに更新があるかどうかを確認できます。
|
Git Fetch
変更を元の場所からフェッチを介してローカルブランチにダウンロードします。 Fetchは、他の人が行ったすべてのコミットをリモートリポジトリに要求しますが、ローカルリポジトリにはありません。 Fetchはこれらのコミットをダウンロードし、ローカルリポジトリに追加します。
Gitマージ
mergeコマンドを使用して、フェッチによってダウンロードされた変更を適用できます。マージは、フェッチから取得したコミットを取得し、それらをローカルブランチに追加しようとします。マージはローカル変更のコミット履歴を保持するため、ブランチをプッシュで共有すると、Gitは他のユーザーが変更をマージする方法を認識します。
Gitプル
フェッチとマージは頻繁に一緒に実行されるため、2つを組み合わせるコマンドpullが作成されました。 Pullはフェッチを実行してからマージを実行し、ダウンロードしたコミットをローカルブランチに追加します。
|
簡単に言えば、インターネットに接続せずに飛行機に飛び乗ろうとした場合...出発する前にgit fetch origin を実行できます。すべての変更をコンピューターにフェッチしますが、ローカルの開発/ワークスペースから分離してください。
飛行機では、ローカルワークスペースに変更を加えてから、フェッチしたものとマージし、インターネットに接続しなくても、潜在的なマージの競合をすべて解決できます。そして、誰かがリモートリポジトリに新しい変更を加えていない限り、目的地に到着したら、git push origin を実行してコーヒーを飲みに行きます。
この素晴らしいアトラシアンチュートリアルから:
git fetchコマンドは、コミット、ファイル、および参照を
リモートリポジトリをローカルリポジトリに。
フェッチは、他の人が持っているものを見たいときに行うことです
取り組んでいます。確認できるという点でSVNアップデートに似ています
中心的な歴史がどのように進んだか、しかしそれはあなたに強制しません
実際に変更をリポジトリにマージします。 Gitは分離します
既存のローカルコンテンツからコンテンツをフェッチしました。
ローカル開発作業に影響はありません。フェッチされたコンテンツは、gitcheckoutコマンドを使用して明示的にチェックアウトする必要があります。これは
コミットを統合する前に、コミットを確認するための安全な方法を取得する
ローカルリポジトリ。
リモートリポジトリからコンテンツをダウンロードする場合、タスクを実行するためにgitpullおよびgitfetchコマンドを使用できます。あなたは考えることができます
gitは、2つのコマンドの「安全な」バージョンをフェッチします。ダウンロードします
リモートコンテンツですが、ローカルリポジトリの動作状態は更新されません。
現在の作業はそのままにしておきます。 gitpullはより積極的です
または、アクティブなローカルのリモートコンテンツをダウンロードします
分岐してすぐにgitmergeを実行し、マージコミットを作成します
新しいリモートコンテンツ用。保留中の変更が進行中の場合
これにより競合が発生し、マージ競合の解決が開始されます
フロー。
git pullの場合:
孤立することはありません。
明示的にチェックアウトする必要はありません。暗黙的にgitマージを行うためです。
マージステップはローカル開発に影響を与え、競合を引き起こす可能性があります
基本的に安全ではありません。それは攻撃的です。
.git / refs / remotesにのみ影響するgitfetchとは異なり、git pullは.git / refs / remotesと.git / refs / heads /の両方に影響します
うーん...それで、git fetchで作業コピーを更新していない場合、どこで変更を加えますか? Gitフェッチは新しいコミットをどこに保存しますか?
素晴らしい質問です。それはあなたの作業コピーから隔離された場所にそれを置きます。しかし、再びどこで?確認してみましょう。
プロジェクトディレクトリ(つまり、gitコマンドを実行する場所)で次の操作を行います。
ls。これにより、ファイルとディレクトリが表示されます。クールなことは何もありません、私は知っています。
次に、ls-aを実行します。これにより、ドットファイル、つまり。で始まるファイルが表示されます。これで、.gitという名前のディレクトリが表示されます。
cd.gitを実行します。これは明らかにあなたのディレクトリを変更します。
ここで楽しい部分があります。 lsを行います。ディレクトリのリストが表示されます。参照を探しています。 CD参照を行います。
すべてのディレクトリの内容を確認するのは興味深いことですが、そのうちの2つに焦点を当てましょう。ヘッドとリモコン。それらの中もチェックするためにcdを使用してください。
gitフェッチを実行すると、/。git / refs / remotesディレクトリのアイテムが更新されます。 /.git/refs/headsディレクトリ内の何も更新されません。
git pullは、最初にgitフェッチを実行し、/。git / refs / remotesディレクトリ内のアイテムを更新してから、ローカルとマージしてから、/。git / refs / headsディレクトリ内のヘッドを変更します。
非常に良い関連する答えは、「gitfetch」がそれ自体をどこに配置するかにもあります。
また、Gitブランチの命名規則の投稿から「スラッシュ表記」を探してください。 Gitがどのように物事を配置するかをよりよく理解するのに役立ちます異なるディレクトリ。
実際の違いを確認するには
ただしてください:
gitフェッチオリジンマスター
gitチェックアウトマスター
リモートマスターが更新された場合は、次のようなメッセージが表示されます。
あなたのブランチは2つのコミットによって 'origin / master'の後ろにあり、早送りすることができます。
(「gitpull」を使用してローカルブランチを更新します)
フェッチせずにgitcheckout masterを実行しただけの場合、ローカルgitは2つのコミットが追加されていることを認識しません。そしてそれはただ言うでしょう:
すでに「マスター」に
あなたのブランチは「origin / master」で最新です。
しかし、それは時代遅れで正しくありません。それは、gitが知っていることに基づいてフィードバックを提供するからです。まだプルダウンされていないことは、新しいコミットには気づいていません...
ローカルでブランチで作業しているときにリモートで行われた新しい変更を確認する方法はありますか?
一部のIDE(Xcodeなど)は非常にスマートで、gitフェッチの結果を使用し、現在の作業ブランチのリモートブランチで変更されたコード行に注釈を付けることができます。その行がローカル変更とリモートブランチの両方によって変更されている場合、その行には赤の注釈が付けられます。これはマージの競合ではありません。これは潜在的なマージの競合です。これは、リモートブランチからgit pullを実行する前に、将来のマージの競合を解決するために使用できるヘッドサップです。
楽しいヒント:
リモートブランチをフェッチした場合(例:した:
git fetch origin feature / 123
次に、これはリモートディレクトリに移動します。ローカルディレクトリではまだ利用できません。ただし、DWIMによるそのリモートブランチへのチェックアウトが簡素化されます(私が言っていることを実行してください)。
gitチェックアウト機能/ 123
あなたはもうする必要はありません:
git checkout -b feature / 123 origin / feature / 123
詳細については、こちらをお読みください
|
gitpullとgitfetchの唯一の違いは次のとおりです。
git pullはリモートブランチからプルし、それをマージします。
git fetchはリモートブランチからのみフェッチしますが、マージしません
つまり、git pull = git fetch + git merge..。
|
Gitを使用すると、新しいコミットの後に時系列で古いコミットを適用できます。
このため、リポジトリ間でコミットを転送する動作は、次の2つのステップに分かれています。
リモートブランチからローカルリポジトリ内のこのリモートブランチのコピーに新しいコミットをコピーします。
(レポからレポへの操作)master @ remote >> remote / origin / master @ local
ローカルブランチへの新しいコミットの統合
(インサイドレポ操作)remote / origin / master @ local >> master @ local
手順2を実行するには2つの方法があります。次のことができます。
最後の共通の祖先の後にローカルブランチをフォークし、ローカルリポジトリに固有のコミットと並行して新しいコミットを追加し、コミットをマージしてフォークを閉じます。
最後の共通の祖先の後に新しいコミットを挿入し、ローカルリポジトリに固有のコミットを再適用します。
gitの用語では、ステップ1はgit fetch、ステップ2はgitmergeまたはgitrebaseです。
gitpullはgitfetchとgitmergeです
|
Gitは、次の2つのコマンドを使用して、リモートからローカルへの最新バージョンのブランチを取得します。
git fetch:Gitはリモートからローカルに最新バージョンを取得しますが、自動的にマージされません。

gitフェッチオリジンマスター
git log -p master..origin / master
gitマージオリジン/マスター
上記のコマンドは、メインブランチの最新バージョンをオリジンからリモートからオリジンマスターブランチにダウンロードすることを意味します。次に、ローカルマスターブランチとオリジンマスターブランチを比較します。最後に、マージします。
git pull:Gitはリモートから最新バージョンを取得し、ローカルにマージします。

git pull origin master
上記のコマンドは、gitfetchおよびgitmergeと同等です。実際には、マージの前に変更を確認してマージするかどうかを決定できるため、gitfetchの方が安全かもしれません。
|
gitpullとgitfetchの違いは何ですか?
これを理解するには、まず、ローカルgitがローカルリポジトリを維持するだけでなく、リモートリポジトリのローカルコピーも維持することを理解する必要があります。
git fetchは、リモートリポジトリのローカルコピーを最新の状態にします。たとえば、リモートリポジトリがGitHubの場合、リモートリポジトリで行われた変更を、リモートリポジトリのローカルコピーにフェッチすることができます。これにより、比較やマージなどの操作を実行できます。
一方、git pullは、リモートリポジトリの変更を、独自のコードを保持する場所に移動します。通常、git pullは最初にgitfetchを実行してリモートリポジトリのローカルコピーを最新の状態にし、次に変更を独自のコードリポジトリと場合によっては作業コピーにマージします。
|
git pull ==(git fetch + git merge)
gitfetchはローカルブランチに変更されません。
目的のプロジェクト用にリモートが設定されたローカルリポジトリがすでにある場合は、gitfetchを使用して既存のリモートのすべてのブランチとタグを取得できます。 ... Fetchはローカルブランチに変更を加えないため、リモートブランチをペアのローカルブランチとマージして、新しくフェッチした変更を組み込む必要があります。 githubから
|
初心者のためのシンプルなグラフィック表現、
ここに、
git pull
コードをフェッチしますリポジトリからローカルでリベースします... git pullでは、新しいコミットが作成される可能性があります。
しかし、で、
git fetch
リポジトリからコードをフェッチするので、gitrebaseを使用して手動でリベースする必要があります
例:サーバーマスターからフェッチして、ローカルマスターにリベースします。
1)git pull(リベースは自動的に行われます):
git pull origin master
ここでの起点はリモートリポジトリマスターであり、ブランチです
2)git fetch(手動でリベースする必要があります):
gitフェッチオリジンマスター
サーバーの変更をオリジンからフェッチします。そして、あなたが自分でそれをリベースするまで、それはあなたのローカルにあります。コードをチェックして、競合を手動で修正する必要があります。
git rebase origin / master
これにより、コードがローカルにリベースされます。その前に、あなたが正しいブランチにいることを確認してください。
|
明確でシンプルにしようとしています。
git pullコマンドは、実際にはgit fetchのショートカットであり、構成に応じてgitmergeまたはgitrebaseコマンドが続きます。 git pullがフェッチとそれに続くリベースになるように、Gitリポジトリを構成できます。
|
実際、Gitは独自のコードのコピーを維持し、
リモートリポジトリ。
コマンドgitfetchは、リモートリポジトリからデータを取得することにより、ローカルコピーを最新の状態にします。これが必要な理由は、他の誰かがコードに変更を加えた可能性があり、自分自身を最新の状態に保ちたいからです。
コマンドgitpullは、リモートリポジトリの変更を、独自のコードを保持する場所に移動します。通常、git pullは、最初に「git fetch」を実行してリモートリポジトリのローカルコピーを最新の状態にし、次に変更を独自のコードリポジトリと場合によっては作業コピーにマージすることでこれを行います。
|
1
2
次
非常に活発な質問。この質問に答えるために10の評判を獲得してください。レピュテーション要件は、この質問をスパムや無回答のアクティビティから保護するのに役立ちます。
あなたが探している答えではありませんか? git version-control git-pull git-fetchのタグが付いた他の質問を参照するか、独自の質問をしてください。