リベースとマージは全く異なることを行います。
あなたがにGitリポジトリを言っているgit merge develop
を実行します。
- は、現在のコミット(
HEAD
)を識別します。これにはハッシュIDがあります。
- 別のコミットを特定します。
develop
。これにはハッシュIDがあります。 ...--o--B--o--1 <-- somebranch (HEAD)
\
o--o--2 <-- develop
は#をコミットする(git diff
のように)マージベースの比較:
トレース最低共通の祖先マージベースは、手順1と2で識別される2つのコミットのコミットを見つけるために、グラフをコミット1。
- マージベースとコミット#2を比較します。
- これら2つの差分を結合します。 (この組み合わせのステップでは、
-X theirs
は違いがあります:2つの差分にマージの競合がある場合、Gitはそれらの変更を優先します。両方の変更を行います)。マージベースのツリーに結果を適用します。
現在のブランチ上の親(この順序で)#1、#2で、「コミットマージ」新しいタイプのコミットしてください:あなたが今、再び同じgit merge
を実行する場合
...--o--B--o--1---M <-- somebranch (HEAD)
\ /
o--o--2 <-- develop
GitはM
と2
を見つけ、マージベースを見つけます(今度はB
ではなく2
です)。何もしないと宣言します。マージベースはすでに2つのコミットのうちの1つです。から到達ではありません
(このマージが行われた後、M
)すべてのリストは、現在のブランチの先端から到達可能なコミットしてください:
あなたがgit rebase develop
を実行すると、あなたがするGitリポジトリを言っています(#2をコミット)develop
で識別コミット:
...--o--B--o*-1*--M <-- somebranch (HEAD)
\ /
o--o--2 <-- develop
私は*
でこれらのコミットをマーク。注:M
もM
からアクセスできますが、2
ではアクセスできません。 git rebase
は意図的にすべてのマージをスローします。マージをリベースしようとすると意味がありません。すべてのコピーが正常に行われた後
...--o--B--o*-1*--M <-- somebranch
\ /
o--o--2 <-- develop
\
o*'--1*' <-- HEAD
(:名前develop
で識別コミットした後に新しいコピーを配置する「戸建HEAD」モード、コピー(下記参照)マークコミットをして、使用
-
...--o--B--o--1---M [abandoned]
\ /
o--o--2 <-- develop
\
o'--1' <-- somebranch (HEAD)
:
が今どこからsomebranch
ラベルを削除し、コピーしたコミットの最後に置き、)任意の競合をマージ解決を含みます
コミットをコピーするには、本質的に(場合によっては文字通り)git cherry-pick
を実行します。チェリーピック操作は、それ自体がマージの「動詞の種類」です(少し独特のマージベースであり、「私たち」と「彼」もコメントとして混乱する可能性があります)。したがって、これらの各コピーは、多くのコミットがコピーされるため、コンフリクトをマージすることができます。 M
で行った解決方法は無視されます(当然、M
自体は無視されるため)。
「開発」を 'foo'にマージした場合、' git rebase development'をフォローして 'foo'が捕捉されていることを確認してください。そのようなマージを行うことの全ポイントは、 'foo'をキャッチすることです。 –