ГИТ-СВН и местные отделения - PullRequest
5 голосов
/ 22 марта 2011

Я обычно использую git для управления версиями, но сейчас я застрял с исходниками в репозитории svn, поэтому я использую git-svn для доступа к этому репозиторию. Однако это, кажется, приводит к некоторым проблемам, когда я пытаюсь использовать локальные ветви.

Обычно я фиксирую свои локальные репозитории только раз в день, поэтому у меня может быть коммит в локальном мастере, который я еще не отправил в апстрим. Когда я создаю ветку в этот момент, а затем кто-то другой фиксирует в обратном хранилище, все коммиты между текущим и последним, который был синхронизирован в восходящем потоке, дублируются.

Чтобы было понятнее, короткая картинка:

A-B-C-D-E  
     \  
      \-F

Верхний репозиторий находится в точке A, а две ветви - в точке E и F соответственно. Выполнение git svn rebase приводит к:

A-G-H-B-C-D-E
 \
  \-B-C-F

Где G и H - коммиты, которые были взяты из репо в восходящем потоке. Я уже пытался перевести два коммита в другую ветку, переключившись туда и выполнив еще один git svn rebase. Но это оставляет меня там:

A-G-H-B-C-D-E
 \
  \-G-H-B-C-F

Так что это приводит к еще большему дублированию коммитов. Есть ли чистый способ справиться с этой ситуацией?

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Вы можете использовать git rebase для повторного применения любого диапазона коммитов к любому конкретному коммиту, что звучит так, как вы хотите здесь. Эта техника работает для перемещения любого диапазона коммитов, но, как я упоминаю внизу, если у вас на самом деле есть только один коммит F на вашей ветке, тогда легче просто выбрать вишню. Однако сначала я опишу, как бы вы это сделали с git rebase, поскольку это более полезно в целом.

(нет. Я собираюсь слегка переименовать ваши коммиты, так как два B s, C s и т. Д. Будут иметь разные идентификаторы коммитов после перебазировки.)

После первого git svn rebase

Итак, если бы вы хотели сделать этот ребазинг после первого git svn rebase, вы бы оказались в ситуации:

A-G-H-B'-C'-D'-E'
 \
  \-B-C-F

На данный момент вы могли бы сделать:

git rebase --onto C' C F

... который бы создал:

A-G-H-B'-C'-D'-E'
\          \
 \-B-C-F    \-F'''

После второго git svn rebase

Если ситуация будет такой, как вы описали после второго git svn rebase, это выглядело бы так:

A-G-H-B'-C'-D'-E'
 \
  \-G'-H'-B''-C''-F''

В этом случае вы можете сделать то же самое:

git rebase --onto C' C'' F''

Для создания графика:

A-G-H-B'-C'-D'-E'
 \         \
  \          \- F'''
   \
    \-G'-H'-B''-C''-F''

... и вы можете просто забыть о G' до F''.


Однако в обоих этих случаях вы перемещаете только один коммит, так что, вероятно, проще выбрать коммит. Другими словами, вы можете сделать:

git checkout -b new-experiment C'
git cherry-pick F

Надеюсь, это пригодится.

1 голос
/ 22 марта 2011

Вы всегда должны использовать 'git svn rebase' перед 'git svn dcommit', чтобы избежать таких проблем.Это отражает обычное использование SVN обновления перед фиксацией.Подробности см. В разделе «REBASE VS. PULL / MERGE» в http://git -scm.com / docs / git-svn .

...