Лучше использовать слияние или перебазирование, когда два человека находятся в одной и той же ветке удаленных функций и имеют конфликты, которые будут переданы в SVN - PullRequest
4 голосов
/ 09 декабря 2011

Мой коллега и я ведем активную дискуссию о стратегиях слияния, и я надеюсь, что мы сможем получить некоторую информацию, чтобы помочь решить ее.

Tl: dr: Должны ли мы использовать слияние или ребазирование при вытягиванииизменения из удаленной ветви, так что мы не постоянно переделываем разрешение конфликта.

  • svn: наш главный золотой репозиторий
  • trunk: git: отслеживание удаленной ветви svn.Используется для создания git-изменения перед передачей в subversion.
  • feature-branch: git remote branch, где объединяется работа 2+ коллег по одной функции
  • colleague1: локальная ветвь первого коллеги
  • colleague2: местное отделение второго коллеги.

Мы используем отличный рабочий процесс Себастьяна Варетта из Опасно ли использование git-svn dcommit после слияния с git? .

Проблема, с которой мы сталкиваемся, состоит в том, что каждый раз, когда colleague1 переходит из svn (переходит в транк, а затем переходит в коллегу 1, прежде чем нажать на feature-ветвь, когда это сделано), затем фиксирует ветвь Feature, конфликт которой друг с другом должен быть повторен.-сделанный.Одно и то же разрешение конфликтов нужно делать снова и снова - каждый раз, когда выполняется рабочий процесс svn rebase.

Обратите внимание, что мы используем git rebase mirror un-3451 для этой перебазировки.

Мой аргумент заключается в том, чтомы должны использовать git merge mirror un-3451.Насколько я понимаю, это даст коммит, который помечен как слияние двух предыдущих коммитов.Поэтому git будет знать, что не следует использовать предыдущие коммиты, а вместо этого использовать коммит слияния.

Мой коллега, с другой стороны, утверждает, что использование слияния значительно усложнит возможное слияние с svn и намного предпочтет использовать rebase,Ему это легко - к сожалению, он не тот, кто разрешает все конфликты.Он утверждает, что использование коммита сквоша даст тот же эффект.

Мой аргумент заключается в том, что слияние имеет тот же эффект, что и сквош, но включает в себя маркировку коммитов, которые были включены.

Состояние 1

svn-trunk:      A
                \
git-trunk:       A'
                 \ 
remote-feature:   A'-----C
                  \     /
c1-feature:        A'--C
                   \
c2-feature:         A'--D

Состояние 2

C конфликтует с D в файле 1 (F1).F1 разрешил конфликт, поэтому D становится D '.

git pull --rebase remote feature
git add F1
git rebase --continue
git push

График фиксации:

svn-trunk:      A-----B
                \     \(svn rebase)
git-trunk:       A'----B'   
                 \ 
remote-feature:   A'-----C---------D'
                  \     / \       /
c1-feature:        A'--C   \     / (git push)
                   \        \   /
c2-feature:         A'-------C--D'

Состояние 3

Теперь colleague1 хочет получить изменения из svn-trunk:

git checkout trunk
git svn rebase

, а затем переназначить их на функцию c2

git checkout feature-branch
git rebase trunk

Повторная установка помещает B1 в функцию c2 и затем C, а затем захватывает D 'и заставляет то же разрешение конфликта стать D' '

График коммитов:

svn-trunk:      A--------B
                \         \(svn rebase)
git-trunk:       A'--------B'   
                 \         \
remote-feature:   A'-----C--\-----D'
                  \     / \--\--\  \       
c1-feature:        A'--C      \  \  \    
                   \           \  \  \  
c2-feature:         A'----------B'-C--D''

Каждый раз, когда происходит цикл git checkout trunk; git svn rebase; git checkout feature-branch; git rebase trunk; git push remote, все разрешения конфликтов необходимо выполнять снова и снова.

Вопросы

  1. если вы перебазируете svn, нажмите на удаленную ветвь, коллега2 передаст некоторые коммиты в удаленную ветвь, а затем, коллега1 выполнит извлечение слияния из удаленной ветки, будет ли в результате коммита слияния упомянуть коммиты svn (и, следовательно, возникнет проблемапри последующих перебазировках).
  2. Что лучше в приведенном выше сценарии: перебазировка или слияние?
  3. Будет ли полезна функция переобучения?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Во-первых, я опущу идентичные узлы и реорганизую узлы так, чтобы каждая ветвь имела свою головку как самый правый узел, чтобы лучше представить дерево. (поправьте меня, если дерево не так). Мои комментарии выделены жирным шрифтом.

Штат 1

svn-trunk:     A
                \
git-trunk:       A'
                  \ 
c1/remote-feature: \----C
                    \     
                     \
                      \
c2-feature:            --D

Затем D был переназначен как D 'на C. Это легкая часть (чтобы понять). Это мог быть черешня (или «обычный» D), если бы не было конфликта.

Состояние 2

C конфликтует с D в файле 1 (F1). F1 разрешил конфликт, поэтому D становится D '.

svn-trunk:     A-----B
                \     \(svn rebase)
git-trunk:       A'----B'   
                  \ 
                   \
c1-feature:         C   
                     \ 
c2/remote feature:    D'

Теперь перейдем к сложной части.

Штат 3

Теперь, colleague1 хочет получить изменения из svn-trunk:

git checkout trunk
git svn rebase

и затем переназначить их на c2-функцию

git checkout feature-branch
git rebase trunk

Перебазирование помещает B1 в функцию c2, затем в C, затем захватывает D 'и заставляет то же разрешение конфликта стать D' '

График коммитов:

svn-trunk:     A
                \         
git-trunk:       A'----B'
                  \     \ 
                   \     \
c1-feature:         C     \       
                     \     \
remote feature:       D'    \
                             \
c2-feature:                   C----D''

У меня есть некоторые трудности с пониманием перехода от состояния 2 к состоянию 3, так как ваши комментарии, кажется, не совпадают с состоянием графика (что выглядит скорее как попытка перенести функцию c2 / remote на транк (в точке B '), с результатом c2-функции. Я думаю, что вы действительно хотели это:

желаемое состояние 3

svn-trunk:     A-----B
                \     \(svn rebase)
git-trunk:       A'----B'   
                        \ 
                         \
c1-feature:               C   
                           \ 
c2/remote feature:          D'

, что означает, что вы не смогли перенести A'-CD 'на A'-B' без дальнейшей необходимости в разрешении конфликта относительно D ', что странно, потому что этого не должно происходить (я пытался воспроизвести это на репозиторий git-svn, и он работает как задумано). Строго говоря, это даже не проблема git-svn, поскольку вы просто отбрасываете одну ветку git против другой. Похоже, вы действительно пытаетесь правильно перебазировать, поэтому я могу только предположить, что некоторая информация отсутствует, то есть то, что я описал, не то, что на самом деле произошло.

0 голосов
/ 09 декабря 2011

Я коллега2.

Моя позиция заключается в том, что частые перебазировки из SVN в нашу ветвь функций вызывают боль. Каждый раз, когда мы перебазируем набор изменений, он воспроизводится поверх изменений SVN. Фактические конфликты находятся в нашем наборе изменений воспроизведения.

В идеале, мы бы раздавили наш набор изменений в один коммит, чтобы конфликты, возникшие в наборе изменений, были разрешены, и не нужно было разрешать их снова после очередной перебазировки.

С другой стороны, мы могли бы подождать, чтобы выполнить перезагрузку из SVN, пока ветвь функции не будет завершена и не будет готова к фиксации.

Я не уверен, что переход от перебазирования, когда мы потянем к слиянию, вообще улучшит наш процесс. Беда в том, что частые перебазировки из SVN, и я не верю, что объединение между веткой функций и нашими локальными ветвями улучшит перебазирование SVN.

...