By Vali Shah
開発者として、私たちの多くはMergeとRebaseのどちらかを選択する必要があります。 私たちがインターネットから得たすべての参照で、誰もが”Rebaseを使用しないでください、それは深刻な問題を引き起こす可能性が”ここでは、mergeとrebaseが何であるか、なぜそれらを使用すべきか(そして使用しないべきではないか)、そしてその方法について説明します。
Git MergeとGit Rebaseは同じ目的を果たします。 そのコミュニケーションの変化から複数の支店まで行っています。※, 最終的な目標は同じですが、これら二つの方法は異なる方法でそれを達成し、あなたがより良いソフトウェア開発者になるにつれて違いを知るこ
この質問はGitコミュニティを分割しました。 の一部としなければなりませんrebaseとしなければなりませんする必要がありません。 各側面にある説得力をこめて利点がある。
Git Merge
バージョン管理システムを使用する開発者にとって、マージは一般的な方法です。 るかどうかの支店作成のための試験、バグ修正、またはその他の理由で、マージする為に変更します。, 具体的には、マージはソースブランチの内容を取得し、それらをターゲットブランチと統合します。 このプロセスでは、ターゲット分岐のみが変更されます。 ソースブランチの履歴は同じままです。,da2a4595a”>
長所
- シンプルで使いやすい
- 完全な履歴と時系列を保持します
- ブランチのコンテキストを維持します
Cons
- コミット履歴は、多くのマージコミットによって汚染される可能性があります
git bisect
それを行う方法
checkout
およびmerge
コマンドを使用して、マスターブランチを機能ブランチにマージします。,
$ git checkout feature$ git merge master(or)$ git merge master feature
これにより、両方のブランチの履歴を保持する機能ブランチに新しい”マージコミット”が作成されます。
Git Rebase
Rebaseは、あるブランチから別のブランチに変更を統合する別の方法です。 Rebaseは、すべての変更を単一の”パッチ”に圧縮します。”その後、ターゲットブランチにパッチを統合します。
マージとは異なり、リベーシングは完了した作業をあるブランチから別のブランチに転送するため、履歴を平flat化します。 このプロセスでは、不要な履歴が排除されます。,
リベースは、変更が階層の上部から下方に渡される方法であり、マージは、彼らが上向きに戻って流れる方法です
Pros
- は、潜在的に複雑な履歴を合理化します
- 単一のコミットを操作するのは簡単です(例えば, これはDevOpsチームにとって役立ちます
Cons
- 機能を一握りのコミットに押しつぶすと、コンテキストを隠すことができます
- パブリックリポジトリのリベースは、チームとして働くときに危険なことがあります
- それはより多くの作業です:rebaseを使用して機能ブランチを維持する常に更新
- リモートブランチでリベースするには、強制的にプッシュする必要があります。, 人々が直面する最大の問題は、強制的にpushですが、git pushデフォルトを設定していないことです。 これにより、ローカルとリモートの両方で同じ名前を持つすべてのブランチが更新され、それに対処するのは恐ろしいことです。
あなたが間違ってリベースし、意図せずに履歴を書き換えると、深刻な問題につながる可能性がありますので、あなたが何をしている
それを行う方法
次のコマンドを使用して、フィーチャブランチをマスターブランチにリベースします。,
$ git checkout feature$ git rebase master
これにより、フィーチャブランチ全体がマスターブランチの上に移動します。 にデザインすることにより再書き込みプロジェクトの歴史創造によるブランドの新しいコミットコミット毎にオリジナル(機能)です。
対話型リベース
これにより、コミットが新しいブランチに移動されるときにコミットを変更できます。 これは、ブランチのコミット履歴を完全に制御できるため、自動化されたリベースよりも強力です。 通常、このはの多種多様化するライフスタイルの乱雑な歴史の前に統合機能支店を修正します。,
$ git checkout feature$ git rebase -i master
これは、移動されようとしているすべてのコミットを一覧表示することによってエディタを開きます。
pick 22d6d7c Commit message#1pick 44e8a9b Commit message#2pick 79f1d2h Commit message#3
これは、リベースが実行された後にブランチがどのように見えるかを正確に定義します。 エンティティを再注文することで、履歴を好きなように見せることができます。 たとえば、fixup
、squash
、edit
などのコマンドをpick
の代わりに使用できます。
どちらを使用するか
最高のものは何ですか?, 専門家は何をお勧めしますか?
すべてのチームが異なるため、どちらか一方を一般化して決定するのは難しいです。 でもどこかから始めないと
チームは、Git rebaseとmergeポリシーを設定するときにいくつかの質問を検討する必要があります。 結局のところ、一方のワークフロー戦略は他方の戦略よりも優れていないからです。 それはあなたのチームに依存します。
組織全体でのリベーシングとGitの能力のレベルを考慮してください。 マージのトレーサビリティと履歴と比較して、リベースの単純さをどの程度重視するかを決定します。,
最後に、マージとリベースの決定は、明確な分岐戦略の文脈で考慮する必要があります(分岐戦略の詳細については、この記事を参照してください)。 成功した分岐戦略は、あなたのチームの組織を中心に設計されています。
私は何をお勧めしますか?
チームが成長するにつれて、常にマージポリシーで開発の変更を管理または追跡することが困難になります。 に清潔で分かりやすいコミットの歴史をRebaseが妥当であると効果的です。,
以下の状況とガイドラインを考慮することで、Rebaseを最大限に活用することができます。
- ローカルで開発しています:あなたが他の誰かとあなたの仕事を共有していない場合。 この時点では、履歴をきれいに保つために、マージよりもリベースを好むべきです。 リポジトリの個人的なフォークを持っていて、それが他の開発者と共有されていない場合は、ブランチにプッシュした後でもリベースしても安全です。
- コードはレビューの準備ができました:プルリクエストを作成しました。 その他の見直しし、潜在的に取得でそのフォーク地域です。, この時点では、作業をリベースしないでください。 “リワーク”コミットを作成し、機能ブランチを更新する必要があります。 これは引き要求のトレーサビリティと助け、偶然の歴史の破損を防ぐ。
- レビューが完了し、ターゲットブランチに統合する準備が整いました。 おめでとう! フィーチャブランチを削除しようとしています。 この時点から他の開発者がこれらの変更でフェッチマージされないことを考えると、これはあなたの履歴をサニタイズするチャンスです。, この時点で、履歴を書き直して、元のコミットとそれらの厄介な”prリワーク”と”マージ”コミットをフォーカスされたコミットの小さなセットに折り畳むこと を明示的統合のためにこれらの犯がありますので、その価値があります。 これに対しての機能を卒業した。li>
結論
この説明がGit mergeとGit rebaseに関するいくつかの洞察を与えてくれたことを願っています。 マージ対リベース戦略は常に議論の余地があります。 もしこの記事を払拭疑問を許可する採用のアプローチすることができる。—