Когда я немного поработал с исходным кодом, я сделал свою обычную фиксацию, а затем отправил в удаленный репозиторий. Но потом я заметил, что забыл организовать импорт в исходном коде. Поэтому я делаю команду исправления, чтобы заменить предыдущий коммит:
> git commit --amend
К сожалению, фиксация не может быть перенесена обратно в хранилище. Это отклонено как это:
> git push origin
To //my.remote.repo.com/stuff.git/
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'
Что мне делать? (Я могу получить доступ к удаленному хранилищу.)
git
git-commit
amend
Spoike
источник
источник
git push -force
более осторожно .Ответы:
Я на самом деле однажды нажал
--force
и.git
хранилище и был отчитан Линусом BIG TIME . В целом это создаст много проблем для других людей. Простой ответ: «Не делай этого».Я вижу, что другие дали рецепт для этого в любом случае, поэтому я не буду повторять их здесь. Но вот совет для выхода из ситуации после того, как вы вытолкнули исправленный коммит с помощью --force (или + master).
git reflog
чтобы найти старый коммит, в который вы внесли изменения (позвоните емуold
, и мы назовем новый коммит, который вы создали путем внесения измененийnew
).old
иnew
, записывая деревоnew
, какgit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Тогда люди , которые были неудачными достаточно , чтобы основывают свою работу на коммит вы стерты изменения и заставляя толчок будет увидеть в результате слияния будет видеть , что вы предпочитаете
new
болееold
. Их последующие слияния не будут видеть конфликты между вамиold
и ихnew
результатом, поэтому им не придется страдать.источник
git reflog
чтобы найти егоВы видите функцию безопасности Git. Git отказывается обновлять удаленную ветку вашей веткой, потому что основная фиксация вашей ветви не является прямым потомком текущей главной ветки ветки, в которую вы отправляете ветку.
Если бы это было не так, то два человека, отправившие в один и тот же репозиторий примерно в одно и то же время, не знали бы, что одновременно поступает новый коммит, и тот, кто нажал последний, потеряет работу предыдущего толкателя без какого-либо из них. они понимают это.
Если вы знаете, что вы единственный, кто нажимает, и вы хотите отправить исправленный коммит или выдать коммит, который свернет ветку, вы можете «заставить» Git обновить удаленную ветку, используя
-f
переключателя.Даже это может не сработать, так как Git позволяет удаленным репозиториям отклонять небыстрые запросы на дальнем конце с помощью переменной конфигурации
receive.denynonfastforwards
. В этом случае причина отказа будет выглядеть следующим образом (обратите внимание на часть «удаленный отказ»):Чтобы обойти это, вам нужно либо изменить конфигурацию удаленного репозитория, либо в качестве грязного хака вы можете удалить и воссоздать ветку таким образом:
Как правило, последний параметр, который
git push
использует формат<local_ref>:<remote_ref>
, гдеlocal_ref
это имя ветви в локальном хранилище иremote_ref
имя ветви в удаленном хранилище. Эта пара команд использует два сокращения.:master
имеет нулевой local_ref, что означает перемещение нулевой ветви на удаленную сторонуmaster
, т.е. удаление удаленной ветви. Имя ветви, не:
имеющей значения, отправляет локальную ветвь с заданным именем в удаленную ветвь с тем же именем.master
в этой ситуации малоmaster:master
.источник
git gc
раза истекли повторные журналы, старые объекты будут удалены. Никто, кто клонирует репозиторий, не получит никаких объектов, которые больше недоступны, как только ветвь будет обновлена.Быстрый разглагольствование: тот факт, что никто не разместил здесь простой ответ, демонстрирует отчаянную враждебность пользователей, проявляемую Git CLI.
В любом случае, «очевидный» способ сделать это, предполагая, что вы не пытались форсировать толчок, - это тянуть первым. Это тянет за собой изменения, которые вы внесли (и так больше не вносили), чтобы вы снова их получили.
Как только вы разрешили конфликты, вы можете нажать еще раз.
Так:
Если вы получаете ошибки в pull, возможно, что-то не так в вашей конфигурации локального репозитория (у меня был неправильный ref в разделе ветки .git / config).
И после
Возможно, вы получите дополнительный коммит с темой, рассказывающей о «тривиальном слиянии».
источник
git push -f
илиgit reset
единственный путь сюда.Краткий ответ: не выдвигайте исправленные коммиты в публичное репо.
Длинный ответ: несколько команд Git, вроде
git commit --amend
иgit rebase
, на самом деле переписывают граф истории. Это нормально до тех пор, пока вы не опубликовали свои изменения, но как только вы это сделаете, вам действительно не стоит копаться в истории, потому что, если кто-то уже получил ваши изменения, тогда, когда они попытаются повторить попытку, это может закончиться неудачей. , Вместо внесения изменений в коммит, вы должны просто сделать новый коммит с изменениями.Однако, если вы действительно хотите добавить исправленный коммит, вы можете сделать это следующим образом:
Ведущий
+
знак заставит произойти толчок, даже если он не приведет к фиксации «ускоренной перемотки вперед». (Ускоренная фиксация происходит, когда изменения, которые вы отправляете, являются прямым потомком изменений, уже находящихся в публичном репо.)источник
git push -f
.Вот очень простой и понятный способ отправить ваши изменения после того, как вы уже сделали
commit --amend
:Что делает следующее:
Не забудьте изменить «origin» и «master», если применяете это к другой ветке или удаленной.
источник
git add
перед моей фиксацией, чтобы включить изменения.git reset --soft "HEAD^"
. В остальном работает нормально.Я решил это, отбросив свой локальный исправленный коммит и добавив новые изменения сверху:
источник
У меня такая же проблема.
Как Git-новичок, я думал, что это полный FUBAR .
Решение: В некотором роде @bara предложил + создал локальную резервную ветку
Возможно, это не быстрое и чистое решение, и я потерял свою историю (1 коммит вместо 5), но это спасло работу за день.
источник
Если вы не отправили код в удаленную ветку (GitHub / Bitbucket), вы можете изменить сообщение коммита в командной строке, как показано ниже.
Если вы работаете над определенной веткой, сделайте это:
Если вы уже отправили код с неправильным сообщением, вам следует быть осторожным при изменении сообщения. то есть после того, как вы измените сообщение фиксации и попытаетесь нажать его снова, у вас возникнут проблемы. Чтобы сделать это гладко, выполните следующие действия.
Пожалуйста, прочитайте весь ответ, прежде чем делать это
Важное примечание: при непосредственном использовании принудительного нажатия вы можете столкнуться с проблемами кода, которые другие разработчики работают в той же ветке. Поэтому, чтобы избежать этих конфликтов, вам нужно извлечь код из вашей ветки, прежде чем делать принудительное нажатие :
Это лучший метод при изменении сообщения фиксации, если оно уже было отправлено.
источник
--force
, см. Принятый ответЕсли вы знаете, что никто не снял ваш неизмененный коммит, используйте
--force-with-lease
опциюgit push
.В TortoiseGit вы можете сделать то же самое в опциях «Push ...» «Force: May Discard» и проверяя «известные изменения».
источник
Вы получаете эту ошибку, потому что пульт Git уже имеет эти файлы коммита. Вы должны принудительно нажать на ветку, чтобы это работало:
Также убедитесь, что вы извлекаете код из удаленного узла, поскольку кто-то из вашей команды мог отправить его в ту же ветку.
Это один из случаев, когда мы вынуждены принудительно выдавать коммит на удаленный доступ.
источник
Вот очень простой и понятный способ отправить ваши изменения после того, как вы уже сделали
git add "your files"
иgit commit --amend
:или:
источник
Если вы используете код Visual Studio, вы можете попробовать это расширение, чтобы упростить его.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
Как вы можете понять из его названия, он выполняет команды последовательно
git commit --amend
git push --force
источник
Мне пришлось решить эту проблему с удалением из репозитория и справиться с возникшими конфликтами слияния, зафиксировать, а затем подтолкнуть. Но я чувствую, что есть лучший способ.
источник
Я просто продолжал делать то, что сказал мне Гит. Так:
Примечание: исправленный коммит был последним.
источник
Следующее сработало для меня при смене автора и коммиттера коммита.
git push -f origin master
Git был достаточно умен, чтобы понять, что это были коммиты идентичных дельт, которые различались только в разделе метаинформации.
И местный, и удаленный руководители указали на коммиты, о которых идет речь.
источник
Вот, как я исправил редактирование в предыдущем коммите:
git stash
теперь ваша рабочая копия чиста в состоянии вашего последнего коммита.git commit --all --amend
Ваш редактор подойдет с запросом сообщения журнала (по умолчанию старое сообщение журнала). Сохраните и выйдите из редактора, когда вы довольны им.
Новые изменения добавляются в старый коммит. Смотрите сами
git log
иgit diff HEAD^
Повторно примените ваши скрытые изменения, если они сделаны:
git stash apply
источник