Не удается нажать после git reset --soft HEAD ^

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

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

Ответ 1

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

(Я предполагаю, что это ваша "главная" ветвь, и вы нажимаете "начало" )

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

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

Ответ 2

Теперь я просто хочу вернуться ко времени, прежде чем я выпустил reset

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

 $ git reflog
 $ git reset --soft formerCommit

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

Ответ 3

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

Ответ 4

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

Вы использовали 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 Afternoon commits, где вы хотите сохранить свою работу до уик-энда в случае отказа оборудования (но вернуть в состояние предварительной фиксации в понедельник).

*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, обсуждаемым в другом ответе, заключается в том, чтобы избежать дополнительных коммитов. reset будет иметь 2 фиксации, и этот способ не будет иметь никаких (никаких дополнительных). Преимущество git reset заключается в том, что он НЕ переписывает историю, поэтому гораздо безопаснее, особенно если вы не уверены в том, что делаете.

(*) Обычно репозитории сконфигурированы так, чтобы НЕ разрешить вам делать это, чтобы выполнить мастер - исправление на ветке и вместо этого создать запрос на перенос. Ибо, если вы прочитали приведенную выше ссылку, переписать историю на master будет иметь СЕРЬЕЗНЫЕ последствия (если вы не единственный человек, который когда-либо клонирует этот код).