Git rebase, исправление конфликтов, затем push отклоняется - PullRequest
10 голосов
/ 07 мая 2019

Когда я перебазирую и возникают конфликты, которые я затем разрешаю , я получаю следующее сообщение:

подсказка: обновления были отклонены, поскольку кончик вашей текущей ветки отстает от


У нас есть 2 филиала:

  • master наша база
  • feature/fix-input-height (новая функция для объединения с мастером)

Я готовлю feature/fix-input-height, перебирая мастер для локального разрешения конфликтов

git checkout master
git pull origin master

git checkout feature/fix-input-height
git pull origin feature/fix-input-height

git rebase master

  • Возникают конфликты
  • Я разрешаю их
  • Затем попытайтесь выдвинуть новую ветвь функции
git push origin feature/fix-input-height

И в итоге отклоненное сообщение об ошибке снова:

подсказка: обновления были отклонены, поскольку кончик вашей текущей ветки отстает от


Каждый в стеке потока предлагает:

git push origin -f feature/fix-input-height

Но форсировать толчок просто неправильно

Ответы [ 3 ]

16 голосов
/ 07 мая 2019

Rebase работает путем копирования коммитов. Вы начинаете с, например ::

...--o--o--o   <-- master
      \
       A--B--C   <-- feature/fix-input-height (HEAD)

и в итоге:

             A'-B'-C'  <-- feature/fix-input-height
            /
...--o--o--o   <-- master
      \
       A--B--C   [previous feature/fix-input-height, now abandoned]

Но у другого хранилища - того, которое не принадлежит вам, к которому вы обращаетесь к своему Git git push, - все еще есть исходные коммиты. У вас больше нет этих коммитов. Вместо этого у вас есть новые и улучшенные, но они этого не знают. Все, что они знают, это то, что вы просите их выбросить три совершенно хороших коммита.

Так они говорят Нет, я не буду их выбрасывать. По крайней мере, если вы используете принудительную команду, а не вежливый запрос.

Вот почему вам нужно --force, или, что лучше, хотя люди не часто его используют - --force-with-lease. В любом случае вы говорите им: Да, я имею в виду, что вы должны выбросить свои коммиты. Разница между этими двумя заключается в том, что --force просто говорит: Бросьте ваши коммиты! Используйте это вместо этого! Использование --force-with-lease говорит: Я думаю, что ваши feature/fix-input-height имена фиксируют C. Если так: выбросить эти коммиты! Используйте это вместо этого! Он потерпит неудачу, если кто-то добавил коммит D, которого у вас нет и, следовательно, не включили в ваш ребаз.

2 голосов
/ 13 мая 2019

Ответ Торека , несомненно, является наиболее проницательным ответом здесь, но, учитывая ваши проблемы и комментарии, которые вы добавили с тех пор, ваша проблема скорее политическая, чем техническая, и вы вправе беспокоиться об этом.

Основной проблемой здесь должно быть «Кто-нибудь еще работает над feature / fix-input-height или это частная ветвь?»

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

Однако, чтобы сделать Git счастливым и избежать, чтобы ваш коллега вручную сбрасывал их собственную локальную копиюВаша ветка, что я, вероятно, сделал бы, чтобы сохранить переходный путь от старой версии к новой.То есть:

  • Объедините свою ветку поверх master , но при разрешении конфликта выбирайте только изменения левой стороны, которые фактически отбросят все из вашей функциональной ветви и уйдут мастер без изменений.Но это все равно приведет к точке слияния;
  • Воспроизведите все коммиты, которые вы действительно хотите переместить, поверх вашей новой функции ветви.
0 голосов
/ 17 мая 2019

Почему бы не объединить?

Если вы часто ошибаетесь при использовании --force, возможно, вам нужно переключиться на ускоренный рабочий процесс : рабочий процесс, в котором принудительные коммиты никогда не меняются.

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

Если вы хотите внести изменения мастера в свою ветку, просто сделайте следующее:

git checkout master # Go on your local master branch
git pull            # Make sure is up to date
git checkout -      # Go back to the previous branch (you can use git checkout mybranch instead)
git merge master    # Merge master into your branch
git push            # Push the fast-forward changes to the repository

Это никогда не вызовет ошибку non-fast-forward или не потребует флаг --force, потому что единственное, что вы делаете с помощью этих команд, это добавление коммитов , а не их перезапись.


Если вы беспокоитесь о том, что все эти слияния будут загромождать ваш вывод git log, помните, что есть опция --no-merges для их добавления, которая прекрасно справляется с задачами ускоренной перемотки вперед.

...