Мне кажется, что этот вопрос задавали много раз, но обычно решение такое: «Я удалил каталог и заново выполнил свою работу с новой проверкой». Я сделал коммит и нажал, но понял, что в сообщении коммита указал неправильный номер билета. Поэтому я посмотрел на 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 счастливым?
git
version-control
rynmrtn
источник
источник
Ответы:
Сила
git push
:источник
receive.denyNonFastForwards
в ответе Брайана Кэмпбелла :+
или--force
может быть недостаточно убедительным, в зависимости от того, как они - кем бы они ни были - настроили свой репозиторий Git.Если нажать коммят на сервер, а затем переписать , что совершить локально (с
git reset
,git rebase
,git filter-branch
или любую другую историю манипуляции), а затем толкнули , что переписанные фиксации обратно на сервер, вы завинчивать никого , кто тянул. Вот пример; скажем, вы зафиксировали A и отправили его на сервер.Теперь вы решаете переписать A, как вы упомянули, сбросив и повторно зафиксировав. Обратите внимание, что в результате остается болтающаяся фиксация A, которая в конечном итоге будет удалена сборщиком мусора, так как она недоступна.
Если кто-то другой, скажем, Фред, отключается
master
от сервера, пока вы это делаете, у него будет ссылка на A, с которой он может начать работать:Теперь, если бы вы могли подтолкнуть свой A 'к origin / master, что привело бы к созданию не-быстрой перемотки вперед, у него не было бы A в его истории. Так что, если бы Фред снова попытался потянуть, ему внезапно пришлось бы выполнить слияние, и он повторно представил бы фиксацию A:
Если Фред это заметит, он сможет выполнить перебазирование, что предотвратит повторное появление коммита A. Но он должен это заметить и не забыть сделать это; и если у вас есть более одного человека, который вытащил A, им всем придется перебазировать, чтобы избежать дополнительной фиксации A в дереве.
Таким образом, как правило, не рекомендуется изменять историю репо, из которого извлекают другие люди. Если, однако, вы знаете, что никто другой не использует это репо (например, это ваше собственное частное репо, или у вас есть только один другой разработчик, работающий над проектом, с которым вы можете легко координировать свои действия), то вы можете принудительно обновить, запустив:
или
Они оба проигнорируют проверку на отсутствие быстрой перемотки вперед и обновят то, что находится на сервере, до вашей новой ревизии A ', отказавшись от ревизии A, так что в конечном итоге она будет собрана для мусора.
Возможно, принудительное нажатие полностью отключено с помощью
receive.denyNonFastForwards
параметра конфигурации. Эта опция включена по умолчанию для общих репозиториев. В этом случае, если вы действительно действительно хотите принудительно выполнить push, лучший вариант - удалить ветку и воссоздать ее с помощьюgit push origin :master; git push origin master:master
. ОднакоdenyNonFastForwards
опция включена по причине, описанной выше; в общем репозитории, это означает, что теперь каждый, кто его использует, должен убедиться, что они перебазируются на новую историю.В общем репозитории, как правило, лучше просто размещать новые коммиты сверху, чтобы исправить любую вашу проблему; вы можете использовать
git revert
для создания коммитов, которые отменят изменения предыдущих коммитов.источник
+develop
свою команду - так что проверка переходит к нему. У вас все равно астрономическое количество очков: Pgit push --force
receive.denyNonFastForwards
параметра конфигурации. Эта опция включена по умолчанию для общих репозиториев. В этом случае, если вы действительно действительно хотите принудительно выполнить push, лучший вариант - удалить ветку и воссоздать ее с помощьюgit push origin :remote_A; git push origin local_A:remote_A
. Но прочтите то, что я написал выше о том, почему делать такой рабочий процесс в общем репозитории - плохая идея. Вы должны пытаться делать это только в том случае, если у вас есть что-то, что вызывает серьезные проблемы в коммите, от которого вы пытаетесь избавиться или переписать.Возможно, вам придется сделать
git pull
, который МОЖЕТ автоматически объединять файлы для вас. Затем вы можете совершить еще раз. Если у вас есть конфликты, вам будет предложено их разрешить.Имейте в виду, что вы должны указать, из какой ветки вывести, если вы не обновили свой gitconfig, чтобы указать ...
Например:
источник
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)Я использовал EGit, и я тоже столкнулся с этой проблемой. Просто попытался перейти
rebase
в текущую ветку, и это сработало.источник