違いは何だgit merge
とはgit rebase
?
違いは何だgit merge
とはgit rebase
?
回答:
もともと3つのコミットがあったとしA
、B
、C
:
次に、開発者Danがcommitを作成しD
、開発者Edがcommitを作成しましたE
。
明らかに、この矛盾はどういうわけか解決されるべきです。これには、2つの方法があります。
MERGE:
両方のコミットD
とE
まだここにありますがM
、両方D
とから変更を継承するマージコミットを作成しE
ます。しかし、これはダイヤモンド形状を作成し、多くの人々は非常に混乱します。
リベース:
commitを作成しますR
。実際のファイルの内容は、M
上記のマージコミットの内容と同じです。しかし、コミットE
は存在しなかったように(ドットで示されている-消失線)、commit は取り除かれます。この抹消のためにE
開発者Edのローカルであり、他のリポジトリにプッシュされてはなりません。リベースの利点は、ダイヤモンドの形状が回避され、歴史が良い直線に保たれることです-ほとんどの開発者はそれを愛しています!
git merge
コミットをインターリーブしません(ただし、を見ると表示される場合がありますgit log
)。代わりに、git merge
DanとEdの両方の開発履歴を一度にそれぞれの視点から見たようにそのまま保持します。git rebase
ダンが最初に取り組んだように見え、エドは彼に続いた。どちらの場合も(マージとリベース)、実際の結果のファイルツリーは完全に同一です。
私はgitについて嫌いな10の事柄からのこの抜粋を本当に気に入っています(2番目の例でリベースについて簡単に説明しています):
3.不機嫌なドキュメント
manページは、万能の「f ***あなた」1です。ユーザーではなくコンピューター科学者の観点からコマンドを説明します。適例:
git-push – Update remote refs along with associated objects
これが人間の説明です:
git-push – Upload changes from your local repository into a remote repository
更新、別の例:(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コミットです。
コードをマージする代わりにマスターにリベースすると、次のようになります。
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
すべてのコミットが一番上(最新)になり、残りのコミットが続きます master
ブランチがます。
(免責事項:私は別の回答で言及されている「Gitについて嫌いな10のこと」の投稿の著者です)
受け入れられ、最も賛成された答えは素晴らしいですが、言葉だけで違いを説明しようとするとさらに役に立ちます。
マージ
リベース
要約:可能な場合、リベースの方がほとんど常に優れています。メインブランチへの再統合を容易にします。
なぜなら?feature機能の作業は、メインブランチに関して1つの大きな「パッチファイル」(別名diff)として提示できます。複数の親を「説明」する必要はありません。少なくとも2つ、1つのマージからのものですが、存在する場合はさらに多くの可能性があります。いくつかのマージでした。マージとは異なり、複数のリベースは加算されません。(別の大きなプラス)