git svn rebase, в то время как другие работают над моими файлами

Я новичок в git, и я пытаюсь работать с ним на моем SVN-сервере. Я не понимаю причину «git svn rebase», чтобы обновиться. Из того, что я понимаю, если я обновляю свой локальный репозиторий на сервере SVN, фиксирую GIT (локально) свои изменения, а не «git svn rebase», я могу перезаписать другие изменения пользователей в файлах, над которыми я работаю.

Правильно ли я понимаю? и если да, то почему я хочу использовать rebase и принимать такой риск (я понимаю идею быстрой перемотки вперед, но это звучит очень рискованно)?

Надеюсь, я не пропущу что-то основное!

Справедливо противоположное: git svn rebase позволяет вам перезаписывать работу других. Как замечает заметка книга Git-SCM , подумайте о git svn rebase как о вашем эквиваленте svn update . Это то, как вы обновляете свой локальный репозиторий с помощью SVN-сервера .

В стандартном рабочем процессе SVN …

… вы проверяете версию репозитория (скажем, @ 9001). Вы вносите некоторые изменения и готовы к фиксации, но oops-someone проверено в изменении 9002. Вы svn update до версии 9002, при необходимости слейте, а затем проверьте свое изменение, чтобы произвести 9003. Если вы не запускали svn update , вы должны перезаписать версию вашего товарища по команде 9002; при запуске svn update вы действуете так, как будто вы основывали свою работу на пересмотре 9002, а не на 9001 .

 SVN 9001-------------------------------9002---------------9003---------> \ \ / svn commit your feature local work [now update] updated work 

В стандартном рабочем потоке git …

… история не пронумерована и не линейна. Вы можете совершать каждый раз, когда хотите, локально и объединять свою работу в зависимости от того, какая команда назначает ветку «мастер».

 your teammate's feature T1--T2--T3---T4--T5 / \ merge master M1------------------M2-------M3------------M4--------M5-------------> \ / merge your feature Y1-----Y2-----Y3--Y4 

Я обозначил Y1 Y2 Y3 Y4 как ваш локальный фиксатор вашей функции , все на основе состояния мира вы проверили M3 . Вся эта история является общедоступной, поэтому, если вы должны были совершить то же, что и выше, ваши товарищи по команде могли бы рассказать вам, что вы основали Y1 от M3. Если вы хотите изменить это , вы могли бы попросить git вместо этого отключить функцию M4. Это называется git rebase .

 your teammate's feature T1--T2--T3---T4--T5 / \ merge master M1------------------M2-------M3------------M4----------------M5-----> \ / merge your feature after rebase Y1--Y2--Y3--Y4 

После переустановки все идентификаторы фиксации (хэши) меняются, потому что они вычисляются на основе родителей вашего фиксации и, переустанавливая вас, вы намеренно меняете родителей.

Итак, в рабочем потоке git + svn …

… вам нужно сопоставить граф фиксации git с линейной историей svn . Это означает запуск svn update ( git svn rebase ) перед фиксацией, чтобы основать вашу работу на последней версии в репозитории SVN.

 SVN 9001-------------------------------9002----------------9003---------> \ \ / git svn dcommit your feature Y1--Y2--Y3--Y4 [now rebase] Y1--Y2--Y3--Y4 

Дополнительную информацию и примеры см. В главе Git-SCM по SVN .