gitでは、フェッチはプルとどのように異なり、マージはリベースとどのように異なりますか?


160

私はこれを理解できません。私はウェブや本でたくさん読んでいて、何かが頭に残っていません。誰かが私に次のダミーバージョンを教えてもらえますか?

  • git fetch vs pull
  • git merge vs rebase

24
質問者に同情します。ドキュメントとアドバイスは非常に重いため、ワークフローの組み合わせが非常に多く、非常に混乱しています。頭が爆発しただけで、何を質問すればいいのかわからない。
Ed Randall

3
受け入れられたペストレラの答えを選んでみませんか?
Arashsoft 2016

@Arashsoft 2013
VdeX

回答:


415

フェッチvsプル

fetch リモート*ブランチから変更をダウンロードし、リポジトリデータを更新しますが、ローカル*ブランチは変更しません。

pullを実行しfetch、さらにmergeローカルブランチに変更を加えます。

違いは何ですか? pullプルされたブランチからの変更でローカルブランチを更新します。A fetchはローカルブランチを進めません。

マージとリベース

次の履歴があるとします。

          C --- D --- Eローカル
         /
    A --- B --- F --- Gリモート

merge2つの開発履歴を結合します。これは、リモートブランチの上に分岐した後にローカルブランチで発生した変更を再生し、その結果を新しいコミットに記録することによって行われます。この操作では、各コミットの祖先が保持されます。

aの効果はmerge次のとおりです。

          C --- D --- Eローカル
         / \
    A --- B --- F --- G --- Hリモート

rebaseローカルブランチに存在するコミットを取り、リモートブランチの上にそれらを再適用します。この操作は、ローカルコミットの祖先を書き換えます。

aの効果はrebase次のとおりです。

                  C '-D'-E 'ローカル
                 /
    A --- B --- F --- Gリモート

違いは何ですか?A mergeはコミットの祖先を変更しません。Aは、rebase ローカルのコミットの祖先を書き換えます。

*この説明は、現在のブランチをローカルブランチであることを前提とし、分岐が引数として指定されていることfetchpullmerge、またはrebaseリモートブランチです。これは通常のケースです。pullたとえば、指定したブランチから変更をダウンロードし、リポジトリとmerge変更を現在のブランチに更新します。


31
これは、各実践の背後にある議論に入ることがない最も簡単で最良の説明です。ありがとうございました!
ジョナサンS.フィッシャー

3
絶対に黄金の答え
ChaseMoskal 2014年

5
この回答を「お気に入り」にしたいと思います。多分私はそれを印刷して自分の壁にテープで貼ります。
LarsH 2015年

2
私は私がスタックオーバーフローで得た最良の答えのうち最高のものを言うでしょう、ありがとう
Shahab J

1
フェッチがリモートブランチから変更をダウンロードしてリポジトリデータを更新するだけで、ローカルブランチは変更しない場合、作業ディレクトリが変更を表示または反映しない場合、フェッチのポイントは何ですか?私の質問は元々、他の誰かが行った変更をどのように確認し、それらを自分の作業ディレクトリにマージするか(つまり、他の人の変更を実験して、それが私の作業に影響を与えないことを確認する)ことができるかということでしたが、私はまだそれを行う方法が混乱していますか?プルして実験/探索するだけで問題が発生した場合は、ハードリセットを実行しますか?

28

フェッチとプル

Gitフェッチはリポデータを更新するだけですが、Gitプルは基本的にフェッチを実行し、プルされたブランチをマージします

「git pull」と「git fetch」の違いは何ですか?


マージとリベース

Atlassian SourceTreeブログ、マージまたはリベースから:

マージは、各コミット履歴の祖先を維持しながら、2つの開発ラインを統合します。

対照的に、リベースは、ソースブランチからの変更を書き直して宛先ブランチの子として表示することにより、開発ラインを統合します。これらのコミットが宛先ブランチの上にずっと書き込まれたように見せかけます。

また、Learn Git Branchingもチェックしてください。これは、HackerNews(postへのリンク)に投稿されたばかりの素晴らしいゲームで、分岐とマージの多くのトリックを教えています。私はそれがこの問題で非常に役立つと信じています。


Felipsに感謝します。リモートからフェッチを実行すると、masterブランチに更新が反映されません。また、
merga

リベースとマージは、リベースがすべてのコミット履歴を再書き込みすることを念頭に置いて、ユーザーの意図に依存します。そして、はい、フェッチのみを行う場合、masterブランチは変更されません。リモートの変更を適用するには、masterブランチをマージ(またはプル)する必要があります
Felipe Sabino '15

git merge <remote>/<branch>。たとえば、自分がマスターブランチで、リモートがoriginという名前の場合、次のようにできますgit merge origin/master
フェリペサビノ2013

だから私はいつもgit checkout master git fetch git diff origin / master git rebase origin master
techsjs2013

8

プル対フェッチ

私がこれを理解する方法は、それgit pullは単にがgit fetch続くことgit mergeです。つまり、リモートブランチから変更をフェッチし、それを現在のブランチにマージします。


マージとリベース

コマンドが言うようにマージは行います。現在のブランチと指定されたブランチの違いを(現在のブランチに)マージします。つまり、コマンドgit merge another_branchanother_branch現在のブランチにマージされます。

リベースの動作は少し異なり、ちょっとクールです。コマンドを実行するとしますgit rebase another_branch。Gitはまず、現在のブランチとの間の最新の共通バージョンを見つけますanother_branch。つまり、分岐が分岐する前のポイント。次に、gitはこの分岐点をの先頭に移動しanother_branchます。最後に、元の分岐点以降の現在のブランチのすべてのコミットが、新しい分岐点から再生されます。これにより、ブランチとマージが少なくなり、非常にクリーンな履歴が作成されます。

ただし、落とし穴がないわけではありません。バージョン履歴は「書き換え」られるため、ローカルgitリポジトリにのみコミットが存在する場合にのみ、これを行う必要があります。それは次のとおりです。決してあなたがリモートレポにコミットをプッシュしている場合は、これを行いません。

このオンラインブックで説明されているリベースの説明は、わかりやすいイラストで非常にわかりやすくなっています。


マージではなくリベースでプルする

私は実際にはリベースをかなり使用していますが、通常はプルと組み合わせています:

git pull --rebase

リモートの変更をフェッチし、マージではなくリベースします。つまり、最後にプルを実行したときからのローカルコミットをすべて再生します。これは、マージで通常のプルを実行するよりもはるかにクリーンだとわかります。マージを使用すると、追加のコミットが作成されます。


それで、私がブランチで作業していて、プッシュする前にそれをマスターにマージしたい場合。マスターをチェックアウトする必要がありますが、リベース修正を取得しますか?
techsjs2013

私はまだスタンドマージとリベースを
理解していません

ペストレラからの回答によって提供されたイラストは、その違いをかなりはっきりと示していると思います。また、チェックアウト:git-scm.com/book/en/Git-Branching-Rebasing-これは、説明のかなりまともな仕事をします(回答のリンクと同じリンクですが、怠惰なリンクのために再度提供されています)。
Steinar 2013

0

マージ -HEADブランチは新しいコミットを生成し、各コミット履歴の祖先を保持します。同じブランチで並行して作業する複数の人がマージコミットを行うと、履歴が汚染される可能性があります。

リベース -新しいコミットを作成せずに、ブランチの変更を別のブランチに再書き込みします。コード履歴は単純化され、線形で読みやすくなっていますが、プルリクエストでは機能しません。誰かが行った小さな変更を確認できないためです。

git merge機能ベースのワークフローを扱う場合、またはリベースに慣れていない場合に使用します。しかし、よりクリーンで線形の履歴git rebaseが必要な場合は、その方が適切です。詳細については、このマージまたはリベースの記事を確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.