2015-02-13 2 views
0

Можете ли вы помочь мне решить эту тайну. У нас была проблема в течение нескольких месяцев, когда, порой, изменения, похоже, «исчезают» или регрессируют в нашем git-репо. Я, наконец, понял, что это происходит.Git merge вызывает регрессии

Наш рабочий процесс - это создание ветки функций от мастера и начало работы. Когда мы готовы объединить нашу работу, мы сначала объединим мастер на ветку функций и исправим любые конфликты или проблемы интеграции.

Во время этого конкретного слияния, git решил выбрать вариант ветвления функции куска, когда он должен был выбрать кусок от мастера. Никаких конфликтов слияния, git просто решил, что это правильно, неправильно. Зачем? И что мы можем сделать, чтобы этого не случилось?

ответ

2

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

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

Спекулятивная причина, по которой исчезают ваши изменения, заключается в том, что основная версия файла была совершена совсем недавно, чем фиксация ветви признака. Когда вы объединяете master в функцию, конфликтов слияния не возникает, поэтому git автоматически объединяет ветви для удобства.

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

Edit:

как бы мы обрабатываем исправление, которое должно произойти в середине интеграции функции с мастером?

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

git checkout -b hotfix origin/master 
# do changes 
git commit -am "Made hotfix" 
git checkout master 
git merge hotfix 

# hotfix complete! 
git push origin master 

, как мы держим долго выполняющиеся полнометражных ветви до настоящего времени?

Это переработка хлеба и масла! Если ваша функция изолирована, вы, вероятно, не будете иметь для восстановления. Это говорит о том, что вы должны стараться максимально эффективно использовать свою функцию, поэтому восстановление этих ветвей функций - хорошая идея. Это также означает, что вы «интегрируете», когда идете!

git checkout master 
git checkout -b long_feature master 
# commit 
# commit 
# commit 

# now to rebase! 
# get latest changes from others 
git fetch origin 
# update your local master branch to reference the latest from origin/master 
git branch -f master origin/master 
# do the rebase! 
git rebase master 

# repeat this cycle as often and as many times as necessary until your feature is complete 

При переустановке вам может потребоваться разрешение конфликтов. Это то, что вам нужно было бы сделать на каком-то этапе в любом случае, и если вы это сделаете по ходу дела, вы, вероятно, будете решать менее сложные конфликты, поскольку они скорее инкрементны, чем «большой взрыв».

+0

Мы объединим мастер в функцию сначала как своего рода интеграционный тест. Мы хотим убедиться, что код работает с самым современным мастером до фактического слияния с мастером, особенно если много изменений произошло с мастером, поскольку была создана ветвь функции. Является ли rebase лучшим решением для этого рабочего процесса? –

+0

Да, rebase сделает это за вас. Ваши изменения будут внесены в самую последнюю дату, поэтому вы знаете, что используете самые последние изменения. Тем не менее, используя DVCS, вы можете сделать слияние локально и протестировать (не затрагивая других пользователей), а затем нажать на свой общий пульт, когда вы счастливы, что он работает. – acanby

+0

Есть два вопроса об этом подходе. Во-первых, как мы будем обрабатывать исправление, которое должно произойти в середине интеграции функции с мастером? Во-вторых, как мы сохраняем длинные функциональные ветви в актуальном состоянии? –