Git отклонен без ускоренной перемотки вперед

Я чувствую, что этот вопрос задавался много раз, но решение, как правило, таково: «Я удалил каталог и заново выполнил свою работу с новой проверкой». Я сделал коммит и нажал, но понял, что я указал неправильный номер билета в сообщении коммита. Поэтому я обратился к SO за быстрым решением и в итоге набрал в терминале следующее:

$ git reset --soft HEAD^
$ git commit -m "... correct message ..."

Единственная проблема в том, что я получаю следующее сообщение об ошибке:

To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

Я использую модель git-flow и работаю над ветвью разработки. Как я могу объединить вещи обратно, чтобы сделать Git снова счастливым?

87 голосов | спросил rynmrtn 14 PMpThu, 14 Apr 2011 21:58:47 +040058Thursday 2011, 21:58:47

4 ответа


0

Принудительно git push:

git push origin +develop
ответил Alan Haggai Alavi 14 PMpThu, 14 Apr 2011 22:29:24 +040029Thursday 2011, 22:29:24
0

Если вы отправляете коммит на сервер, а затем переписываете этот коммит локально (с помощью git reset , git rebase , git filter-branch или любые другие манипуляции с историей), а затем отодвинул этот переписанный коммит обратно в сервер, вы облажаетесь с кем-либо еще, кто вытащил. Вот пример; скажем, вы зафиксировали A и отправили его на сервер.

- * - * - A <- мастер

- * - * - A <- происхождение /мастер

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

- * - * - A
    \
     A '<- мастер

- * - * - A <- происхождение /мастер

Если кто-то еще, скажем, Фред, снимет с сервера master с сервера, у него будет ссылка к A, с которого они могут начать работать:

- * - * - A '<- мастер

- * - * - A <- происхождение /мастер

- * - * - A-B <- Фред /Мастер

Теперь, если бы вы смогли подтолкнуть ваш A к оригиналу /мастеру, что привело бы к не-быстрой перемотке вперед, в его истории не было бы A. Поэтому, если Фред попытается вытащить снова, ему внезапно придется объединиться, и он снова введет коммит A:

- * - * - A '<- мастер

- * - * - A <- происхождение /мастер

- * - * - A-B- \
    \ * <- Фред /Мастер
     A '- /

Если Фред заметит это, то он может сделать ребаз, что предотвратит повторное появление коммита А. Но он должен был заметить это и не забыть сделать это; и если у вас есть несколько человек, которые сбросили А, им всем пришлось бы сделать ребаз, чтобы не получить дополнительный коммит А в дереве.

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

git push -f

или

git push origin +master

Они оба будут игнорировать проверку отсутствия ускоренной перемотки вперед и обновят содержимое на сервере до новой версии A ', отказавшись от версии A, чтобы в конечном итоге она стала собирать мусор.

Возможно, принудительные нажатия полностью отключаются с помощью параметра конфигурации receive.denyNonFastForwards. Эта опция включена по умолчанию в общих репозиториях. В этом случае, если вы действительно хотите принудительно нажать кнопку, лучше всего удалить ветку и создать ее заново, используя git push origin :master; git push origin master:master. Однако опция denyNonFastForwards включена по причине, которая описана выше; в общем хранилище это означает, что теперь каждый, кто его использует, должен убедиться, что он обновляется в новой истории.

В общем репозитории, как правило, лучше просто добавить новые коммиты сверху, чтобы исправить любую проблему, с которой вы столкнулись; Вы можете использовать git revert для генерации коммитов, которые отменят изменения предыдущих коммитов.

ответил Brian Campbell 14 PMpThu, 14 Apr 2011 22:31:49 +040031Thursday 2011, 22:31:49
0

Возможно, вам придется создать git pull, который МОЖЕТ автоматически слить материал для вас. Тогда вы можете совершить снова. Если у вас есть конфликты, вам будет предложено их разрешить.

Имейте в виду, вы должны указать, какую ветвь использовать, если вы не обновили свой gitconfig для указания ...

Например:

git pull origin develop:develop
ответил Tony 14 PMpThu, 14 Apr 2011 22:17:18 +040017Thursday 2011, 22:17:18
0

Я использовал EGit и тоже столкнулся с этой проблемой. Просто попытался rebase текущей ветки, и это сработало.

ответил Nguyen Minh Binh 19 J000000Friday13 2013, 07:39:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132