git merge マージ、squash マージ、rebase マージの 3 つの操作

git merge マージ、squash マージ、rebase マージの 3 つの操作

例:
新しいブランチ dev が、一定期間の開発の後、マスター ブランチのポイント B で引き出されたとします。

  • マスター ブランチに 2 つの新しいコミット M1 と M2 があります。
  • dev ブランチには 3 つのコミット D1、D2、および D3 があります。

以下に示すように:

画像

画像.png

dev ブランチの開発とテストが完了したので、dev ブランチを master ブランチにマージする必要があります。

  1. マージ

これは最も基本的なマージであり、完全な送信履歴を含め、送信履歴をそのままコピーします。

$ git checkout master
$ git merge dev

画像

画像.png

At this time, a merge commit (D4') will also generated. このマージ コミットにはコードの変更は含まれていませんが、dev ブランチのいくつかのコミット リスト (D1、D2、および D3) が含まれています。これらすべてのコミット履歴を確認するには、git コミット履歴 (git ログ) を確認してください。

  1. スカッシュマージ:

文字通りの意味では、この操作は圧縮された提出を完了します.これはどのような問題を解決しますか?開発ブランチで開発作業が行われるため、いくつかの小さな提出、または以前のエラーを修正する提出があります.提出は表示する必要はありません.そうしないと、プロジェクトの提出履歴が複雑になりすぎるため、dev でのすべての提出を 1 つの提出にマージしてから、トランクに提出することができます。

$ git checkout master
$ git merge --squash dev

画像

画像.png

この例では、D1、D2、および D3 からの変更を 1 つの D にマージします。

スカッシュ マージはコミットを生成しないことに注意してください。すべての変更をマージしてローカル ファイルに配置するだけなので、手動で git commit 操作を再度実行する必要があります。手動でコミットする必要があるため、この時点でもう一度注意してください。また、つまり、このコミットは、元の dev ブランチの開発者ではなく、あなたによって生成されたものであり、コミッター自体が変更されています。このように理解することもできます。つまり、dev ブランチのすべてのコード変更を一度に master ブランチに移植します。

  1. リベースマージ

スカッシュ マージはサブミッターの作成者情報を変更するため、これは大きな問題であり、後で問題追跡に対処することは容易ではありません (もちろん、スカッシュ マージ操作は、ブランチ dev の所有者が実行して解決することもできます)いくつかの問題)、リベース マージを保持できます 送信された作成者情報は、コミット履歴と同時にマージすることができ、上記の問題を完全に解決します。

$ git checkout dev
$ git rebase -i master
$ git checkout master
$ git merge dev

リベース マージは 2 つのステップで完了します。
最初のステップ: リベース操作を実行します。その結果、dev ブランチが B ではなく M2 からプルされたように見えます。次に、-i パラメータを使用してコミット履歴を手動で調整します。マージするかどうか、またはマージする方法。たとえば、次の rebase -i コマンドは、テキスト編集ボックスをポップアップ表示します。

pick <D1> Message for commit #1
pick <D2> Message for commit #2
pick <D3> Message for commit #3

D2 は D1 のタイプミスであるため、明示的に指摘する必要はないと仮定して、D2 を fixup に変更します。

pick <D1> Message for commit #1
fixup <D2> Message for commit #2
pick <D3> Message for commit #3

リベース後の状態は次のようになります。

画像

画像.png

D1' は D1 と D2 の合併です。

ステップ 2: マージ操作を再度実行して、dev ブランチを master ブランチにマージします。

画像

画像.png

注: リベースの実行時に競合が発生する場合があります. この時点では、手動で競合を解決してから (git add) コマンドを実行する必要があります. すべての競合が解決された後は、(git commit) コマンドを実行する必要はありません.ただし、リベースが完了するまで (git rebase --continue) コマンドを実行し、リベース操作を途中でやめたい場合は (git rebase --abort) コマンドを実行して元の状態に戻ることができます。リベース前の状態。

著者: CodingCode
リンク: https://www.jianshu.com/p/ff1877c5864e
出典: Jianshu
著作権は著者に帰属します。商用転載の場合は著者に連絡して許可を得てください。非商用転載の場合は出典を示してください。

おすすめ

転載: blog.csdn.net/stallion5632/article/details/129093181