私はいつかgitを使い始めましたが、その複雑さを完全には理解していません。ここでの私の基本的な質問は、git pull
とgit pull --rebase
の違いを見つけることです。なぜなら、--rebase
オプションを追加してもそれほど変わらないように見えるからです。
違いを理解して助けてください。
git pull
=git fetch
+git merge
上流のブランチの追跡に対して
git pull --rebase
=git fetch
+git rebase
上流のブランチの追跡に対して
git merge
とgit rebase
がどう違うか知りたい場合は、 これを読んでください 。
時には、依存しているブランチをリベース/巻き戻したアップストリームがあります。これは大きな問題になる可能性があります - 私たちが下流にいる場合、私たちにとって厄介な衝突を引き起こします。
魔法は
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
ローカルブランチに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
衝突がないという最も単純な場合
また見なさい:
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
これはMergeとRebaseの違いを理解するために重要です。
リベースとは、変更が階層の最上位から下方にどのように受け継がれるのかを示し、マージとは、変更が上方に戻る方法のことです。
詳細は - http://www.derekgourlay.com/archives/428 を参照。