Отмена локального слияния, если удаленный обновляется - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующий git рабочий процесс:

# finish locally committing to feature/new_thing
git push origin feature/new_thing
git checkout develop
git pull # Just in case I get a warning
git merge feature/new_thing
git push origin develop

Это работает 99% времени, но в остальное 1% времени это происходит:

#Me                             #Other dev
git push origin feature/new_thing
                                git merge feature/other_new_thing
git checkout develop
                                git checkout develop
git pull
                                git pull
git merge feature/new_thing
                                git merge feature/other_new_thing
                                git push origin develop
git push origin develop

Теперь мой push предсказуемо терпит неудачу с:

error: failed to push some refs to 'git@server.git'

Каков самый простой способ восстановить синхронизацию?git reset HEAD~ удаляет мою ветвь, и git pull хочет снова объединиться.Я обычно заканчиваю тем, что reset возвращаюсь к ветке и повторяю pull мою регистрацию

Должен быть простой способ сделать это!Я немного попробовал использовать git-workflow, но он часто зависал и требовал еще большего ручного вмешательства.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

При сбое отправки вы знаете, что пульт должен быть обновлен, поэтому ваша локальная копия origin/develop устарела.Мне нравится знать, что изменилось, прежде чем решить, как с этим бороться, поэтому обычно я сначала запускаю

$ git fetch

, поэтому я могу посмотреть на git log --all --graph --decorate или gitk --all или подобное.

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

$ git pull --rebase

Если это не чистый ребаз, вы исправите его вручную - если вы думаете, что это происходитчтобы произойти (или это уже произошло, и вы запустили git rebase --abort), вы можете предпочесть сбросить и заново выполнить слияние вручную:

$ git reset --hard origin/develop

(Я склонен избегать HEAD ~ с коммитами слияния, поскольку яне могу вспомнить, кто из родителей какой).

0 голосов
/ 01 октября 2018

У вас есть два основных варианта.

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

# On local `develop`
git rebase origin/develop

Если вы обнаружите, что слишком много инкрементальных конфликтов слияния в процессе работы, используйте параметр --interactiveс помощью rebase и pre-squash все ваши коммиты на develop из точки, в которой расходится история develop.

Другой вариант - объединить удаленную версию develop с вашей версией.Это неизбежно создаст коммит слияния, который может быть неприглядным, если вы хотите сохранить историю Git как можно более линейной.

# On local `develop`
git merge origin/develop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...