web-dev-qa-db-ja.com

Git pullとgit pull --rebaseの違い

私はいつかgitを使い始めましたが、その複雑さを完全には理解していません。ここでの私の基本的な質問は、git pullgit pull --rebaseの違いを見つけることです。なぜなら、--rebaseオプションを追加してもそれほど変わらないように見えるからです。

違いを理解して助けてください。

270
Rndm

git pull=git fetch+git merge上流のブランチの追跡に対して

git pull --rebase=git fetch+git rebase上流のブランチの追跡に対して

git mergegit rebaseがどう違うか知りたい場合は、 これを読んでください

282
mvp

時には、依存しているブランチをリベース/巻き戻したアップストリームがあります。これは大きな問題になる可能性があります - 私たちが下流にいる場合、私たちにとって厄介な衝突を引き起こします。

魔法はgit pull --rebaseです

通常のgit pullは、おおまかに言って、このようなものです(これらすべての例では、Originというリモートとfooというブランチを使用します)。

# assume current checked out branch is "foo"
git fetch Origin
git merge Origin/foo

一見すると、git pull --rebaseはまさにこれをしていると思うかもしれません:

git fetch Origin
git rebase Origin/foo

しかし、アップストリームのリベースに「潰し」が含まれている場合は、これは役に立ちません(コミットのパッチIDが変更されただけで、順序が変更されたわけではありません)。

これはgit pull --rebaseがそれ以上のことをしなければならないことを意味します。これが何をするのか、そしてどうやってするのかの説明です。

あなたの出発点はこれだとしましょう:

a---b---c---d---e  (Origin/foo) (also your local "foo")

時間が経過し、あなたはあなた自身の "foo"の上にいくつかのコミットをしました:

a---b---c---d---e---p---q---r (foo)

一方、反社会的勢力に合わせて、上流のメンテナは自分の "foo"をリベースしただけでなく、スカッシュを1、2個使ったこともあります。彼のコミットチェーンはこのようになりました:

a---b+c---d+e---f  (Origin/foo)

この時点でgitを引っ張ると混乱が生じます。 Gitフェッチでも。一方の側で "b"と "c"をコミットし、もう一方の側で "b + c"をコミットすると競合するため、git rebase Origin/fooはそれをカットしません。 (そして、d、e、d + eも同様です)。

この場合のgit pull --rebaseの動作は次のとおりです。

git fetch Origin
git rebase --onto Origin/foo e foo

これはあなたに与えます:

 a---b+c---d+e---f---p'---q'---r' (foo)

あなたはまだ衝突を受けるかもしれませんが、それらは本物の衝突(p/q/rとa/b + c/d + e/fの間)であり、b/cがb + cと衝突することによる衝突ではありません。

からの回答(および若干修正):
http://gitolite.com/git-pull--rebase

221
Mauri Lopez

ローカルブランチに2つのコミットがあるとします。

      D---E master
     /
A---B---C---F Origin/master

"git pull"の後、次のようになります。

      D--------E  
     /          \
A---B---C---F----G   master, Origin/master

"git pull --rebase"の後、マージポイントGはありません。DとEは異なるコミットになることに注意してください。

A---B---C---F---D'---E'   master, Origin/master
37
Deqing

衝突がないという最も単純な場合

  • リベースを使って:あなたのローカルコミットをリモートHEADの上にリベースし、 しない マージ/マージコミットを作成
  • without/normal:マージしてマージコミットを作成します

また見なさい:

man git-pull

より正確には、git pullは与えられたパラメータでgit fetchを実行し、git mergeを呼び出して取得したブランチヘッドを現在のブランチにマージします。 --rebaseを使用すると、git mergeの代わりにgit rebaseを実行します。

また見なさい:
いつgit pull --rebaseを使うべきですか?
http://git-scm.com/book/en/Git-Branching-Rebasing

9
drahnr

これはMergeとRebaseの違いを理解するために重要です。

リベースとは、変更が階層の最上位から下方にどのように受け継がれるのかを示し、マージとは、変更が上方に戻る方法のことです。

詳細は - http://www.derekgourlay.com/archives/428 を参照。

7
Sagar Mody