Хотя мой ответ выходит за рамки того, о чем вы спрашиваете, я думаю, что это именно то, что вы намереваетесь сделать.
Вы использовали git reset --soft HEAD^
, чтобы отменить сделанный вами коммит. Это возвращает рабочую копию в состояние до вашей фиксации (поскольку HEAD
указывает на вашу текущую фиксацию, а HEAD^
указывает на предыдущую (если предполагается, что только один родитель).
Но теперь, когда вы git push
, вам говорят что-то вроде:
! [rejected] <branch> -> <branch>e (non-fast-forward)
error: failed to push some refs to 'ssh://<remote server>/<remote path>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Это говорит о том, что коммиты не выстраиваются в очередь, и они предотвращают ошибку. Сообщение об ошибке немного вводит в заблуждение, и вы не хотите делать то, что оно предлагает (попытка синхронизировать вашу ветку). Вы можете знать только НЕ делать это из-за ваших намерений.
Вы можете просто обойти это с помощью --force
(или -f
) (*):
git push --force
Возможно, вам потребуется снова установить восходящий поток:
git push --force --set-upstream origin <branch>
Имейте в виду, что это будет иметь последствия, если другие уже вытянули вашу работу, поскольку будут разные коммиты, которые будут вносить те же изменения (возможно). Смотри https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history.
Чтобы предотвратить какие-либо проблемы, только когда-либо делайте толчки в свои ветви (не какую-то общую ветку - например, ветку development
, в которую разработчики объединяют все свои функциональные ветви) и убедитесь, что открытое общение в вашей команде.
Разработчик обычно использует этот шаблон для того, что я называю Пятничные полуденные коммиты , где вы хотите сохранить свою работу до выходных в случае аппаратного сбоя (но вернуться к состояние предварительной фиксации в понедельник).
*Friday*
git add --all # To add all files whether they are tracked or not
git commit -m "Friday afternoon commit"
git --set-upstream push # --set-upstream is for if the branch doesn't exist on the remote server
*Monday*
git reset --soft HEAD^
git push -f --set-upstream origin <branch>
Преимущество такого способа по сравнению с git revert
, рассмотренным в другом ответе, состоит в том, чтобы избежать лишних коммитов. Сброс будет иметь 2 коммита, и таким образом не будет ни одного (никаких дополнительных). Преимущество git reset
в том, что он НЕ будет переписывать историю, так что это намного безопаснее, особенно если вы не уверены в том, что делаете.
(*) Как правило, репозитории настроены так, чтобы НЕ позволять вам делать это для мастер-исправления в ветке и создания вместо этого запроса на извлечение. Если вы прочитали приведенную выше ссылку, переписывание истории на master будет иметь СЕРЬЕЗНЫЕ последствия (если только вы не единственный, кто когда-либо клонировал этот код).