git merge
とgit rebase
の違いは何ですか?
もともと3つのコミットがあったとしましょう:A
name __、B
name __、C
name__。
次に開発者DanがコミットD
name__を作成し、開発者EdがコミットE
name__を作成しました。
明らかに、この衝突はどういうわけか解決されるべきです。これには、2つの方法があります。
_マージ_ :
両方のコミットD
name__とE
name__はまだここにありますが、M
name__とD
name__の両方からの変更を継承するマージコミットE
name__を作成します。しかし、これは diamond shapeを作成します。これは多くの人にとって非常に分かりにくいと思います。
_ rebase _ :
実際のファイルの内容は上記のmerge commit R
name__の内容と同じであるcommit M
name__を作成します。しかし、コミットE
name__は存在しなかったので削除します(点 - 消えている線で表示)。このため、E
name__は開発者Edに対してローカルである必要があり、他のリポジトリにプッシュされたことはありません。リベースの利点は diamond の形が避けられ、歴史が変わらないことです - ほとんどの開発者はそれが大好きです!
gitについて嫌いな10の事柄 からの抜粋が大好きです(2番目の例では、リベースの簡単な説明を示しています)。
3.くだらないドキュメント
Manページは、万能の「f *** you」です。1。それらはユーザではなくコンピュータ科学者の観点からコマンドを記述します。適例:
git-Push – Update remote refs along with associated objects
これが人間の説明です。
git-Push – Upload changes from your local repository into a remote repository
更新、別の例:(thanks cgd)
git-rebase – Forward-port local commits to the updated upstream head
翻訳:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
そして私たちは
git-merge - Join two or more development histories together
これは良い説明です。
1.原本に無修正
個人的には、標準的な図表作成手法はあまり役に立ちません。矢印は常に間違った方向を示しているようです。 (彼らは一般的に各コミットの「親」を指し示していますが、これは時間的に後退することになり、それは奇妙です)。
言葉で説明すると:
私が理解できない理由のために、GitのためのGUIツールは、個々のマージを抽象化して、マージ履歴をよりきれいに提示するために多くの努力を払ったことがありません。それで、あなたが「きれいな歴史」を望むならば、あなたはリベースを使う必要があります。
のみリベースを使っている人や決してリベースを使っていない人からのブログ記事を読んだことを思い出します。
私はこれをちょっとした例で説明してみましょう。あなたのプロジェクトの他の人々がユーザーインターフェースに取り組んでいるとしましょう、そしてあなたはドキュメントを書いています。リベースをしないと、あなたの歴史は次のようになります。
Write tutorial
Merge remote-tracking branch 'Origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'Origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
つまり、マージとUIはドキュメントのコミットの途中でコミットします。
コードをマージせずにmasterにリベースした場合は、次のようになります。
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
すべてのコミットは一番上(最新)にあり、その後に残りのmaster
ブランチが続きます。
( 免責事項:私は別の回答で言及されている "Gitについて嫌いな10の記事"の著者です )
受け入れられ、最も支持された答えは素晴らしいですが、言葉だけで違いを説明しようとするとさらに便利です:
マージ
リベース
summary:可能な場合、リベースはほぼ常に優れています。メインブランチへの再統合を簡単にします。
なぜなら? featureあなたの機能の仕事は、oneとして提示することができます。親:少なくとも2つ、1つのマージから来ますが、複数のマージがあった場合はさらに多くの可能性があります。 マージとは異なり、複数のリベースは加算されません。(別の大きなプラス)
Git rebaseはマージに近いです。リベースの違いは次のとおりです。
つまり、すべてのローカルコミットは、すべてのリモートコミットの後に最後に移動されます。マージの競合がある場合は、それも解決する必要があります。