これはリベースが行うことと一致しているようです。
git rebaseは、作業ブランチからの各コミットをブランチの上にリプレイします<upstream>
。
両方の定義を調整する場合:
- SVNからのコミットは、ローカルGitコミットがリプレイされるものです。それらは「これまでリベースされたシリーズ」の一部であり、「私たち」として参照されます(あなたの場合、コンテンツ
test.txt
をbar
含むファイル)
- 作業ブランチ(SVN にとって未知のGitコミットを含み、あなたの場合、コンテンツ
test.txt
をbaz
含むファイル)は「それら」であり、それらのローカルGitコミットのそれぞれが再生されています。
つまり、SVNかどうか。
- "
<upstream>
"ブランチ(何も再生されず、これまでにリベースされたコミットの一部である)は " 私たちのブランチ"です。
- 再生されているもの(作業ブランチ)は「彼らのもの」です。
グッドニーモニック先端によってCommaToast:
HEADが指しているものは何でも「私たち」
(そして、リベースしたいブランチgit rebase upstream
をチェックアウトするためにa が最初に行うことupstream
:HEADが参照するupstream
- ours
今。)
混乱は、クラシックにおける作業ブランチの役割に起因する可能性がありgit merge
ます。
マージするとき:
- 「ワーキングブランチ」は「これまでにマージされた」ものを含むものであり、「私たち」と見なされます、
- 他のコミットは何が行われているのかを表します-再生ではありません-作業ブランチの上にマージし、「彼ら」と見なされます。
git rebase
manページが言及、リベース時のマージは、サイドが交換されることを意味します。
同じことを言うもう1つの方法は、それを考慮することです。
- 私たちが持ってチェックアウトしたブランチにすること「である私たち」
- 私たちが持っていたもの(そしてマージまたは再生されているもの)は「彼らのもの」です。
マージ時:
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
、現在のブランチ「B」は変更しないので、現在持っているのはまだ私たちが取り組んでいたものです(そして別のブランチからマージします)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
しかし、リベースでは、リベースする最初のことは上流ブランチをチェックアウトすることなので、サイドを切り替えます!(その上に現在のコミットを再生するため)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
はまずHEAD
Bを上流のブランチに変更しますHEAD
(したがって、以前の「現在の」作業ブランチと比較して、「ours」と「theirs」が入れ替わります。)
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
、そしてリベースは新しい「私たちの」Bブランチで「彼ら」のコミットを再生します:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
唯一の追加手順git svn rebase
は、SVNコミットを表すGitリモートブランチで最初にsvn "fetch"が実行されることです。
最初は次のとおりです。
x--x--x--x--x(*) <- current branch B, "ours" for now.
\
\
\--y--y--y <- SVN tracking branch, "theirs for now"
、最初にSVNからの新しいコミットでSVNトラッキングブランチを更新します
x--x--x--x--x(*) <- current branch B, still "ours", not for long
\
\
\--y--y--y--y'--y' <- SVN tracking branch updated
、次に現在のブランチをSVN側に切り替えます(これは「ours」になります)。
x--x--x--x--x <- for "B", now "their" during the rebase
\
\
\--y--y--y--y'--y'(*) <- SVN tracking branch updated, and branch B:
now "ours" (this is "what we now have")
、あなたが取り組んでいたコミットを再生する前(ただし、現在はそのリベース中に「彼ら」)
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--y'--y'--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream SVN tracking branch