Как предотвратить множество конфликтов git, когда git перебазирует много коммитов? - PullRequest
38 голосов
/ 30 августа 2011

История: в середине проекта моя коллега создала новый филиал из master и начала выполнять свою тяжелую работу по рефакторингу. Я создал свою ветку из master и начал делать новые вещи на странице. Мы регулярно выполняем коммиты, но только я могу переназначить код на master (поскольку изменения коллег слишком велики и их пока нельзя развернуть с master). К сожалению, некоторые из наших работ опираются на одни и те же файлы. Поэтому после нескольких дней работы, когда она, наконец, захотела изменить свои изменения на master , у нее возникло множество git-конфликтов.

my_branch    #---#----#-#-------#----#--#-----#---#----#----#
            /     \              \   \   \              \    \
master     *-------*--------------*---*---*--------------*----*----*
            \                                                     /
her branch   #------#-------#-----------#-----------#------------#

Вопрос 1: : как предотвратить множество конфликтов git, когда мы работаем над одними и теми же файлами? (или какова лучшая практика в этой ситуации?)

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

my_branch    #---#----#-#-------#----#--#-----#---#----#----#
            /     \              \   \   \              \    \
master     *-------*--------------*---*---*--------------*----*----*
            \                   \            \                    /
her branch   #------#-------#----*------#-----*-----#------------#

И это то, что беспокоит нас. Во время этих перебазировок она исправляла эти конфликты. Но git не помнит ее решения по исправлению конфликта, поэтому, когда она сделала еще одну замену git с master на her-branch , ей пришлось исправить те же конфликты git снова что она исправляла в предыдущих ребазах.

Вопрос 2: : как заставить git запомнить исправление конфликта git после git rebase из ветки master , поэтому после следующей перезагрузки нам не нужно снова исправлять те же конфликты

Ответы [ 2 ]

50 голосов
/ 30 августа 2011

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

... но по сути вы можете просто сделать:

git config --global rerere.enabled 1

... и забудьте об этом, наслаждаясь легким перебазированием / объединением:)

3 голосов
/ 30 августа 2011

Убедитесь, что вы всегда выполняете ребазинг, используя переключатель --onto.

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

...