Здається, це відповідає тому, що робить перебазування.
git svn rebase
витягне версії з батьківського SVN поточного HEAD і перебазує поточну (неприйняту до SVN) роботу проти нього.
git rebase
не згадує:
Зверніть увагу, що злиття перебазування працює, відтворюючи кожне комітування з робочої гілки поверх <upstream>
гілки.
Через це, коли відбувається конфлікт злиття:
- сторона, про яку повідомляється як наша, - це поки що перебазована серія, починаючи з
<upstream>
,
- а їх робоча галузь .
Іншими словами, сторони поміняні місцями .
git rebase відтворює кожен коміт з робочої гілки поверх <upstream>
гілки.
Якщо узгодити обидва визначення:
- коміти, що надходять від SVN - це ті, над якими відтворюються локальні коміти Git. Вони є частиною "поки що переоцінених серій" і називаються "нашими" (у вашому випадку
test.txt
файл із bar
вмістом)
- робоча гілка (що містить коміти Git, невідомі SVN, у вашому випадку
test.txt
файл із baz
вмістом) є "їх", і кожен з цих локальних комітів Git відтворюється.
Іншими словами, SVN чи ні:
- "
<upstream>
" гілка (поверх якої відтворюється що-небудь і яка є частиною дотепер відновлених комітів ")" наша ".
- те, що відтворюється (робоча гілка), є " їхнім ".
Хороший мнемонічний наконечник від CommaToast :
на що вказує HEAD, це "наше"
(і перше, що git rebase upstream
робить a , щоб перевірити upstream
гілку, поверх якої ви хочете перебазувати: HEAD посилається upstream
- ours
зараз.)
Плутанина, швидше за все, походить від ролі робочої галузі в класиці git merge
.
Під час злиття:
- "робоча гілка" - це та, що містить те, що "поки що об'єднано", і вважається "нашою",
- тоді як інший коміт представляє те, що відбувається - не відтворюється, але - зливається поверх робочої гілки і розглядається як "їх".
Як git rebase
згадується на сторінці сторінки, злиття під час перебазування означає, що сторона поміняна місцями.
Ще один спосіб сказати те саме - врахувати, що:
- те, що ми маємо на зареєстрованій гілці, є " нашим ",
- те, що у нас було (і об'єднується чи відтворюється), є " їхнім ".
Під час злиття :
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
(звідси перемикач "наш" та "їх" порівняно з попередньою "поточною" робочою гілкою.)
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.
Ви спочатку мали:
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 (яка стає "нашою")
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