git pull VS git fetch Vs git rebase


294

もう一つの問題は、言ったgit pullようなものですgit fetch+ git merge

しかし、git pullVS git fetch+ の違いは何git rebaseですか?


2
誰かがリンクを片付ける必要があります...そして、私は他の質問が何票を獲得したかに驚いています。
xenoterracide 2010

13
@xeno:「私もこの質問があった」という人の数を数えるだけだと思います
bobobobo

45
いつか本当にgitのドキュメントを読む時間が見つかるでしょうが、それまでは、これらのタイプの質問に投票を追加しています
Eran Medan

回答:


336

それはあなたが実際にちょうど間の差について求めていることを、あなたの質問からかなり明白であるべきgit mergegit rebase

それで、あなたが一般的なケースにいるとしましょう-あなたはあなたのマスターブランチでいくつかの仕事をしました、そしてあなたはオリジンのそれからプルします、そしてそれはまたいくつかの仕事をしました。フェッチ後、次のようになります。

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

この時点でマージすると(git pullのデフォルトの動作)、競合がないと想定すると、次のようになります。

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

一方、適切なリベースを実行した場合、次のようになります。

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

どちらの場合も、作業ツリーの内容は同じになるはずです。あなたはそれに至るまでの異なる歴史を作ったばかりです。リベースにより履歴が書き直され、R最初にコミットした場所()ではなく、オリジンの新しいマスターブランチ()の上にコミットしたように見えますH。他の誰かがすでにマスターブランチからプルした場合は、リベースのアプローチを使用しないでください。

最後に、git pullconfigパラメータbranch.<name>.rebaseをtrueに設定することで、マージの代わりにリベースを使用するように特定のブランチを実際に設定できることに注意してください。を使用して、これを1回のプルで行うこともできgit pull --rebaseます。


39
誰かがすでにマスターブランチからプルした後でリベースした場合はどうなりますか?それはレポを壊しますか?
Didier A.

12
誰かがマスターブランチからプルしたかどうかはどうやってわかりますか?
フランク

29
誰かが持っていないことを確実に知らない場合、あなたは彼らが持っていると仮定するべきです。
Chris Down、

4
origin / master以外の場所にも変更をプッシュしない限り、他の誰かが問題の変更をプルしたという問題に遭遇することはないと思います。マスター、そもそもリベースするものがありません。警告は本当にX-> origin / Xよりも複雑なものがある場合にのみ重要であるように見えますが、私は間違っている可能性があります。見落としているシナリオを誰かが知っている場合は、共有してください。
neverfox

1
@SteveChambersいいえ、それは結果ではありません。線は単にコミットの祖先を表します。つまり、AはBの親です。QとBのどちらが先だったかは関係ありません。これらの操作はすべて、時間ではなくコミットグラフに基づいています。リベースは単にいくつかのコミットを移植するだけであり、その結果は、コミットのタイムスタンプが何であるかに関係なく示したものです。
Cascabel 2013年

9

TLDR:

git pull実行されているようなもので git fetch、その後git merge
git pull --rebaseのようなものですgit fetchその後、git rebase

最初の声明に答えて、

git pullgit fetch+のようなものgit mergeです。

「デフォルトモードでは、git pullはFETCH_HEAD がgit fetch後に続く 略記ですgit merge」より正確にgit pullgit fetch、指定されたパラメーターで実行されgit merge、取得されたブランチヘッドを現在のブランチにマージするための呼び出しを行います。

(参照:https : //git-scm.com/docs/git-pull


2番目のステートメント/質問:

「しかし、git pullVS git fetch+ git rebaseの違いは何ですか」

繰り返しますが、同じソースから:
git pull --rebase

「--rebaseを使用すると、git mergeではなくgit rebaseが実行されます。」


さて、あなたが尋ねたかったら

「の違いmergeとをrebase

それもここで答えられます:
https : //git-scm.com/book/en/v2/Git-Branching-Rebasing
(バージョン履歴の記録方法の変更の違い)


2
「git pull --rebase」はほとんどの場合「git fetch then git rebase」のようなものですが、常にそうとは限りません。一部の状況では、「git pull --rebase」はもう少し多くのことを行います。こちらでよく参照されるこの例を参照してください:gitolite.com/git-pull--rebase
Daniel K.

1
お返事ありがとうございます。これからのgit fetch + git rebaseコマンドの動作を本当に理解しています。今から私たちのgitツリーに多少の矛盾はありません:)
Travis Le
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.