Я использую Git-SVN , и я заметил , что , когда я должен исправить конфликт слияния после выполнения git svn rebase
, смысла --ours
и --theirs
вариант , например ,git checkout
, обратная. То есть, если возникает конфликт, и я хочу сохранить версию, полученную с сервера SVN, и выбросить изменения, которые я сделал локально, я должен использовать ours
, когда я ожидал, что это будет theirs
.
Почему это?
Пример:
mkdir test
cd test
svnadmin create svnrepo
svn co file://$PWD/svnrepo svnwc
cd svnwc
echo foo > test.txt
svn add test.txt
svn ci -m 'svn commit 1'
cd ..
git svn clone file://$PWD/svnrepo gitwc
cd svnwc
echo bar > test.txt
svn ci -m 'svn commit 2'
cd ..
cd gitwc
echo baz > test.txt
git commit -a -m 'git commit 1'
git svn rebase
git checkout --ours test.txt
cat test.txt
# shows "bar" but I expect "baz"
git checkout --theirs test.txt
cat test.txt
# shows "baz" but I expect "bar"
Ответы:
Это похоже на то, что делает rebase.
git svn rebase
будет извлекать ревизии из родительского SVN текущего HEAD и перемещать текущую (незафиксированную в SVN) работу против нее.git rebase
упоминает:Обратите внимание, что слияние с перебазированием работает путем воспроизведения каждого коммита из рабочей ветки поверх
<upstream>
ветки.Из-за этого, когда возникает конфликт слияния:
<upstream>
,Другими словами, стороны меняются местами .
Если согласовать оба определения:
test.txt
файл сbar
содержимым)test.txt
файл сbaz
содержимым) - «их», и каждый из этих локальных коммитов Git воспроизводится.Другими словами, SVN или нет:
<upstream>
ветвь " " (поверх которой все воспроизводится, и которая является частью пока перебазированных коммитов ") является" нашей ".Хороший мнемонический совет от CommaToast :
(и первое, что a
git rebase upstream
делает это, чтобы проверитьupstream
ветку, поверх которой вы хотите перебазировать: HEAD ссылаетсяupstream
-ours
сейчас.)Путаница, вероятно, связана с ролью рабочей ветви в классике
git merge
.Когда вы объединяетесь:
Как
git rebase
упоминается на странице руководства , слияние во время перебазирования означает, что стороны меняются местами.Другой способ сказать то же самое - учесть следующее:
При слиянии :
, мы не меняем текущую ветку 'B', поэтому то, что у нас есть, остается тем, над чем мы работали (и мы сливаемся из другой ветки)
Но при перебазировании мы переключаемся на сторону, потому что первое, что делает перебаз, - проверяет восходящую ветвь! (чтобы воспроизвести поверх него текущие коммиты)
A
git rebase upstream
сначала изменитHEAD
B на восходящую ветвьHEAD
(отсюда переключение «наших» и «их» по сравнению с предыдущей «текущей» рабочей веткой.), а затем перебазирование воспроизведет 'их' коммиты в новой 'нашей' ветке B:
Единственный дополнительный шаг
git svn rebase
заключается в том, что сначала выполняется svn "выборка" в удаленной ветви Git, представляющей коммиты SVN.У вас изначально есть:
, вы сначала обновляете ветку отслеживания SVN новыми коммитами, поступающими из SVN
, затем вы переключаете текущую ветвь на сторону SVN (которая становится «нашей»)
, перед воспроизведением коммитов, над которыми вы работали (но которые теперь «их» во время этой перебазировки)
источник
git rebase
странице руководства ...