Не могу нажать после сброса git --soft HEAD ^ - PullRequest
11 голосов
/ 07 января 2010

Только что я совершил и нажал ( да, моя ошибка на толчке ), что я решил «вернуть» или «отменить». Поэтому мне сказали выпустить git reset --soft HEAD^ с моей стороны, и я подумал, что это каким-то образом создаст «возвратный» коммит, который после фиксации сделает его таким, как если бы изменения не произошло. Я не возражаю, если история изменений вообще существует, это то, что, как я предполагал, произошло бы.

В любом случае, после того, как я сделал это снова, и затем, когда я попытался нажать, я получил ошибку без ускоренной перемотки вперед. Теперь я знаю, что что-то напортачило с перезагрузкой, что-то вроде моего дерева и дерева происхождения теперь «не соответствует», но мне интересно, как это исправить. Теперь я просто хочу вернуться ко времени до того, как я выполнил сброс, чтобы я мог просто вручную отменить изменения, вынув их вручную, а затем зафиксировав, если кто-то еще не может порекомендовать правильный способ отмены принудительной фиксации и Я не имею в виду, что история должна быть удалена из журнала или чего-то еще.

Ответы [ 4 ]

8 голосов
/ 07 января 2010

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

(я предполагаю, что это ваша ветка 'master', а вы переходите к 'origin')

Синхронизируйте с вашим пультом, чтобы перейти в то же состояние.

git remote update
git checkout master
git merge origin/master

Теперь верните ваш коммит

git revert HEAD (or where ever the commit you want to revert is now)
git commit -av

Синхронизация с вашим пультом

git push
5 голосов
/ 07 января 2010

Теперь я просто хочу вернуться ко времени до того, как произвел сброс

Если вы хотите отменить только что git reset --soft, который вы только что сделали, вы можете найти прежний идентификатор фиксации HEAD в reflogs

 $ git reflog
 $ git reset --soft formerCommit

И тогда вы можете подготовить свой git revert

2 голосов
/ 20 ноября 2017

Хотя мой ответ выходит за рамки того, о чем вы спрашиваете, я думаю, что это именно то, что вы намереваетесь сделать.

Вы использовали 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 будет иметь СЕРЬЕЗНЫЕ последствия (если только вы не единственный, кто когда-либо клонировал этот код).

0 голосов
/ 07 января 2010

Вы хотели использовать git revert HEAD для создания нового коммита, который отменял бы коммит в HEAD. Вместо этого вы просто переместили HEAD обратно в коммит до текущей HEAD.

...