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