Вы видите функцию безопасности Git. Git отказывается обновлять удаленную ветку своей веткой, потому что фиксация головы вашей ветви не является прямым потомком текущего фиксации головы ветви, на которую вы нажимаете.
Если бы это было не так, то два человека, которые толкали в один и тот же репозиторий примерно в одно и то же время, не знали бы, что произошел новый коммит, и тот, кто толкнул последний, потерял бы работу предыдущего без какого-либо из них, понимая это.
Если вы знаете, что вы единственный человек, нажавший, и вы хотите надавить измененную фиксацию или нажать фиксацию, которая ветрует ветвь, вы можете «заставить» Git обновить удаленную ветку с помощью переключателя -f
.
git push -f origin master
Даже это не может работать, как Git позволяет удаленным хранилищам отказаться от не-FastForward выталкивает на дальнем конце с помощью переменной конфигурации receive.denynonfastforwards
.Если это так причина отказ будет выглядеть следующим образом (обратите внимание на «удаленный отвергнут» часть):
! [remote rejected] master -> master (non-fast forward)
Чтобы обойти эту проблему, вам необходимо либо изменить конфигурацию удаленного репозитария или грязного хака вы можете удалить и заново создать ветку таким образом:
git push origin :master
git push origin master
в общем последний параметр git push
использует формат <local_ref>:<remote_ref>
, где local_ref
является наименование филиала на локальном хранилище и remote_ref
это название филиала на удаленном хранилище , Эта пара команд использует два сокращения. :master
имеет значение null local_ref, что означает наведение нулевой ветви на удаленную сторону master
, т. Е. Удаление удаленной ветви. Имя филиала без :
означает, что локальная ветвь с указанным именем выдает на удаленную ветку с тем же именем. master
в этой ситуации не хватает для master:master
.
Что делать, если мой -amend должен был только изменить сообщение фиксации? Любой способ редактировать последнее сообщение фиксации, если оно уже было нажато на удаленный? Я сделал это на Github и получил то же сообщение о не быстрой перемотке вперед. Затем я применил решение ниже, но слияние просто добавило больше сообщений фиксации сверху .. – 2010-03-06 23:17:26
@faB: Я думаю, что это FAQ. Сообщение фиксации хешируется вместе с фиксацией, поэтому chaning _it_ изменяет revid (hash). Если это не ясно: нет, вы не можете. IIRC может хранить внеполосную информацию в заметках (поэтому вы можете аннотировать существующие коммиты, не изменяя их). Чтобы наметить определенные коммиты, используйте теги – sehe 2011-03-21 22:06:14
Вы скоро (git1.8.5, Q4 2013) сможете [делать «git push -force» более тщательно] (http://stackoverflow.com/a/18505634/6309). – VonC 2013-09-10 08:42:54