違い - git フェッチ マージ




'git pull'と 'git fetch'の違いは何ですか? (20)

違いは何であるgit pullとはgit fetch

これを理解するには、まずローカルgitがローカルリポジトリだけでなく、リモートリポジトリのローカルコピーも保持していることを理解する必要があります。

git fetchリモートリポジトリのローカルコピーを最新のものにします。たとえば、リモートリポジトリがGitHubの場合、リモートリポジトリ内の変更をリモートリポジトリのローカルコピーにフェッチすることができます。これにより、比較やマージなどの操作を実行できます。

git pull一方、リモートリポジトリの変更を自分のコードを保存する場所に持っていくでしょう。通常git pullは、git fetchまずリモートリポジトリのローカルコピーを最新の状態にしてから、変更内容を独自のコードリポジトリと作業コピーにマージします。

司会者注:この質問にすでに67件の回答が掲載されており(削除されたものの一部)、別の投稿を投稿する前に新しい投稿を投稿ているかどうかを検討します。

git pullgit fetchの違いは何ですか?


ボーナス:

上記の答えでプル&フェッチすることについて、私は興味深いトリックを共有したいと思いますが、

git pull --rebase

このコマンドは、私のgitの生活の中で最も有用なコマンドであり、多くの時間を節約しました。

新しいコミットをサーバに送る前に、このコマンドを実行すると、最新のサーバ変更(フェッチ+マージ)が自動的に同期され、コミットがgitログの一番上に表示されます。 手動の引っ張り/マージについて心配する必要はありません。

詳細はhttp://gitolite.com/git-pull--rebaseをご覧http://gitolite.com/git-pull--rebase



git fetch 1つの使用例は、最後のプルからリモートブランチに変更があった場合、以下を伝えることです。実際のプルを実行する前にチェックして、現在のブランチと作業コピーのファイルを変更することができます。

git fetch
git diff ...origin

git fetchコードをリモートサーバーからローカルリポジトリの追跡ブランチにプルダウンします。リモートに名前が付いている場合origin(デフォルト)、これらの枝は内となりorigin/、例えばorigin/masterorigin/mybranch-123これらは、彼らは、あなたの現在の枝でないなど、ローカルサーバーからのものの枝のコピー。

git pullgit fetchが、その後そのブランチのあなたの現在のローカルバージョンに追跡ブランチからコードをマージします。あなたがまだその変更の準備が整っていないならば、git fetchまずはまず。


Git Fetch

ローカルブランチへの変更は、元からフェッチまでダウンロードします。フェッチは、リモートリポジトリに、他の人が行ったがローカルリポジトリにはないコミットをすべて要求します。これらのコミットをフェッチしてローカルリポジトリに追加します。

Git Merge

fetchでダウンロードした変更は、mergeコマンドを使用して適用できます。マージは取得したコミットをローカルブランチに追加しようとします。マージはあなたのローカル変更のコミット履歴を保持するので、あなたがブランチをプッシュで共有すると、他人があなたの変更をどのようにマージできるかがわかります。

Git Pull

フェッチとマージは、2つのプルを組み合わせたコマンドが作成されるほど頻繁に実行されます。プルしてからマージして、ダウンロードしたコミットをローカルブランチに追加します。


簡単に

git fetchpullと似ていpullが、マージしません。 リモート更新( refsobjects )をフェッチしますが、ローカルは同じままです(つまり、 origin/masterは更新されますが、 masterは同じままです)。

git pullはリモートからgit pullして即座にマージします。

もっと

git cloneクローンはレポをクローンします。

git rebaseは、上流のブランチにない現在のブランチのものを一時的な領域に保存します。 あなたのブランチは、変更を開始する前と同じになりました。 だから、 git pull -rebaseはリモートの変更をプルダウンし、あなたのローカルブランチを巻き戻し、あなたが最新のものになるまで、あなたの現在のブランチの上にあなたの変更を一つずつ再生します。

また、 git branch -aはローカルとリモートのすべてのブランチで何が起こっているかを正確に表示します。

このブログ記事は役に立ちました:

git pull、git fetch、git clone(とgit rebase)の違い - Mike Pearce

git pullgit fetchgit clonegit rebaseをカバーしています。

====

更新

私は実際にこれを実際にどのように使うのかを示すためにこれを更新すると思った。

  1. リモートからローカルリポジトリを更新します(ただし、マージしないでください):

    git fetch

  2. アップデートをダウンロードした後、違いを見てみましょう:

    git diff master origin / master

  3. あなたがこれらのアップデートに満足しているならば、マージ:

    git pull

ノート:

ステップ2:ローカルとリモート間の差分については、以下を参照してください: ローカルのgitブランチをリモートブランチと比較しますか?

ステップ3:ここでgit rebase originを行うのはおそらくもっと正確です(例えば、急速に変化するレポ)。 別の答えで@Justin Ohmsのコメントを参照してください。

こちらもご覧ください: longair.net/blog/2009/04/16/git-fetch-and-merge : longair.net/blog/2009/04/16/git-fetch-and-merge


Gitは次の2つのコマンドを使ってリモートからローカルに最新バージョンのブランチを取得します:

  1. git fetch:Gitはリモートからローカルに最新のバージョンを取得しようとしていますが、自動的にはマージしません。 git fetch origin master git log -p master..origin/master git merge origin/master

    上記のコマンドは、元のブランチの最新バージョンをリモートから元のマスターブランチにダウンロードすることを意味します。そして、ローカルマスターブランチとオリジナルマスターブランチを比較します。最後に、マージします。

  2. git pull:Gitはリモートから最新のバージョンを入手し、ローカルにマージします。

    git pull origin master

    上記のコマンドは同等ですgit fetchgit merge。実際git fetchには、マージの前に変更を確認し、マージするかどうかを決めることができるため、より安全です。


はっきりしているように努力しています。

gitのプルコマンドでは、実際にされたshortcutためにgitのフェッチに続いてgitのマージgitがリベースあなたの設定に応じてコマンドを。git pullがフェッチされてからrebaseが実行されるように、Gitリポジトリを設定することができます。


リモートリポジトリからフェッチし、相違点を確認してからプルまたはマージすることができます。

これは、 originというoriginリモートリポジトリと、 masterというリモートブランチのorigin/master追跡するブランチの例です。

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

実際にGitは独自のコードとリモートリポジトリのコピーを保持しています。

このコマンドgit fetchは、リモートリポジトリからデータを取得することによってローカルコピーを最新のものにします。私たちがこれを必要とするのは、他の人がコードを少し変更して自分自身を更新したいからです。

このコマンドgit pullは、リモートリポジトリの変更を独自のコードを保存する場所に持ち込みます。通常git pullは、リモートリポジトリのローカルコピーを最新のものにするために 'git fetch'を実行してから、変更をあなた自身のコードリポジトリにコピーし、場合によっては作業コピーにマージします。


我々は単に言う:

git pull == git fetch + git merge

実行git pullすると、データをローカルにマージする必要はありません。実行するとgit fetchgit mergeローカルマシンに最新のコードを入手するために実行する必要があります。それ以外の場合、ローカルマシンコードはマージなしでは変更されません。

Git Guiでは、フェッチするときにデータをマージする必要があります。フェッチしても、ローカルでコードが変更されることはありません。フェッチして一度フェッチしてコードを更新すると、それを確認できます。コードは変更されません。次に、マージします...変更されたコードが表示されます。


簡単で簡単な答えは、 git pullは単にgit fetch続いてgit mergeです。

git pull好きかどうかにかかわらず、自動的にマージされることに注意することは非常に重要です 。 これは、もちろん、マージの競合につながる可能性があります。 リモートがoriginで、ブランチがmasterとしましょう。 引っ張る前にgit diff origin/master実行すると、潜在的なマージの競合を知ることができ、それに応じてローカルブランチを準備することができます。

プルとプッシュに加えて、 いくつかのワークフローには、この記事のようなgit rebaseが含まれています。これは、リンクされた記事から言い換えると、

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch

あなたがこのような状況にgit pull --rebaseした場合、 git pull --rebase誘惑されるかもしれません。 あなたが本当にあなたがやっていることを本当に知っていない限り、私はそれに反対するでしょう。 この警告は、 git-pullバージョン2.3.5manページからのものです。

これは潜在的に危険な操作モードです。 それはあなたが既にその歴史を公開したときにうまくいきません履歴を書き換えます。 git-rebase(1)を慎重に読まない限り、このオプションは使用しないでください。


簡単な言い方をすれば、 git pullgit fetch続いてgit mergeます。

refs/remotes/<remote>/下のリモート追跡ブランチを更新するには、いつでもgit fetchを実行できます。

この操作では、 refs/heads下であなた自身のローカルブランチを変更することはなく、作業コピーを変更しなくても安全です。 私はバックグラウンドでcronジョブでgit fetch定期的に実行している人について聞いたことがありますが(これはやってお勧めしませんが)。

git pullは、ローカルブランチをリモートバージョンで最新の状態にし、他のリモートトラッキングブランチを更新するためのものです。

Gitドキュメント: git pull


違いは何か分かりませんが、これは簡単な説明です。 あなたのローカルホストのmasterは支店です。

リポジトリをクローンすると、リポジトリ全体がローカルホストにフェッチされます。 これは、その時点で、 HEADへの原点/マスタポインタと、同じHEAD指すマスタがあることを意味します。

作業を開始してコミットしたら、マスターポインタをHEAD +あなたのコミットに進めます。 しかし、元の/マスターポインタは、あなたがクローンしたときのものをまだ指しています。

違いは次のようになります:

  • git fetchを実行すると、リモートリポジトリ( GitHub )のすべての変更をフェッチし、起点/マスタポインタをHEAD移動します。 一方、あなたの地元の枝マスターは、それがどこにあるかを指し続けます。
  • git pullを実行すると、基本的にfetch(前に説明したように)を行い、新しい変更をmasterブランチにマージし、ポインタをHEAD移動します。

このインタラクティブなグラフィカル表現は、gitのリファクタリングに非常に役立ちます: http://ndpsoftware.com/git-cheatsheet.html : http://ndpsoftware.com/git-cheatsheet.html

git fetchはリモートからローカルリポジトリに変更を "ダウンロード"します。 git pullは変更をダウンロードし、現在のブランチにマージします。 "デフォルトモードでは、 git pullgit fetch続いてgit merge FETCH_HEADです。"


Gitは、より新しいコミットの後に、時系列的に古いコミットを適用できるようにします。このため、リポジトリ間でコミットを転送する行為は2つのステップに分割されます。

  1. 新しいブランチをローカルブランチ内のこのリモートブランチのリモートブランチからコピーにコピーします。

    (repoからrepoへの操作) [email protected] >> remote/origin/[email protected]

  2. ローカルブランチへの新しいコミットの統合

    (内部レポ操作) remote/origin/[email protected] >> [email protected]

ステップ2を行うには2つの方法があります。

  1. 最後の共通の祖先の後にローカルブランチをフォークし、ローカルリポジトリに固有のコミットと並行して新しいコミットを追加し、コミットをマージして確定し、フォークを閉じます。
  2. 最後の共通祖先の後に新しいコミットを挿入し、ローカルリポジトリに固有のコミットを再適用します。

git用語、ステップ1は、git fetchステップ2であり、git merge又はgit rebase

git pullであるgit fetchgit merge


唯一の違いgit pullとはgit fetchその次のとおりです。

git pull リモートブランチから引き出してマージします。

git fetch リモートブランチからのみフェッチしますが、マージはしません

つまりgit pull = git fetch + git merge ...


git-pull - Fetch from and merge with another repository or a local branch
SYNOPSIS

git pull   …
DESCRIPTION

Runs git-fetch with the given parameters, and calls git-merge to merge the 
retrieved head(s) into the current branch. With --rebase, calls git-rebase 
instead of git-merge.

Note that you can use . (current directory) as the <repository> to pull 
from the local repository — this is useful when merging local branches 
into the current branch.

Also note that options meant for git-pull itself and underlying git-merge 
must be given before the options meant for git-fetch.

あなたがヒストリーがマージされたければ、もしあなたがここでいくつかの記事をタグ付けしている人がいるので、あなたはちょうど「codez」を望むなら、あなたは取り出すだろう。


git pull = git fetch + git merge 




git-fetch