Как мне вернуть Git-репозиторий к предыдущему коммиту? - PullRequest
6929 голосов
/ 06 ноября 2010

Как мне вернуться из моего текущего состояния к снимку, сделанному на определенном коммите?

Если я сделаю git log, то получу следующий вывод:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Каквернуться к фиксации с 3 ноября, т.е. совершить 0d1d7fc?

Ответы [ 41 ]

10 голосов
/ 01 июля 2015

Если вы хотите исправить какую-то ошибку в последнем коммите, хорошей альтернативой будет использование команды git commit --amend . Если последняя фиксация не указана какой-либо ссылкой, это сделает свое дело, так как создаст фиксацию с тем же родителем, что и последняя фиксация. Если нет ссылки на последний коммит, он просто будет отброшен, и этот коммит будет последним коммитом. Это хороший способ исправления коммитов без возврата коммитов. Однако у него есть свои ограничения.

9 голосов
/ 05 мая 2017

Сначала получите строку, которая идентифицирует фиксацию за определенную дату, выполнив:

git rev-list -n 1 --before="2009-07-27 13:37" origin/master

, она напечатает идентификатор фиксации, возьмет строку (например, XXXX) и выполните:

git checkout XXXX
9 голосов
/ 01 ноября 2016

Для отката (или для возврата):

  1. git revert --no-commit "commit-code-to-remove" HEAD (например, git revert --no-commit d57a39dHEAD)
  2. git commit
  3. git push

Попробуйте выполнить два шага выше, и если вы обнаружите, что это то, что вам нужно, то git push.

Если вы нашли что-то не так, сделайте:

git revert --abort

8 голосов
/ 26 мая 2017

Это можно сделать намного проще с SourceTree .Просто щелкните правой кнопкой мыши коммит, который вы ищете, и выберите «Оформить заказ» из меню.

enter image description here

8 голосов
/ 04 декабря 2015

Еще одно простейшее решение; Вы должны изменить ветку, чтобы сделать это, но после этого вы можете просто запустить:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
7 голосов
/ 23 февраля 2015

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

  1. Выделил нужную мне ветку, скопировал ее.
  2. Проверил последнюю ветку.
  3. Скопировал содержимое нужной мне ветки в каталог самой последней ветки, переписав изменения и подтвердив это.
7 голосов
/ 28 сентября 2016
git reflog

Выберите количество HEAD (s) из git reflog, куда вы хотите вернуться и что делать (для этого примера я выбрал 12):

git reset HEAD@{12} --hard
6 голосов
/ 07 декабря 2017

Наименее сложный способ вернуть ветку к любому конкретному коммиту, в котором вы не можете изменить найденную мною историю, состоит в следующем:

  1. извлекать коммит или ветку, из которой вы хотите вернуться.
  2. Отредактируйте .git / HEAD и измените ссылку на ветку, к которой вы хотите вернуться.

Например:

echo 'ref: refs/heads/example' > .git/HEAD

Если вы затем выполните git status, вы должны увидеть все изменения между веткой, в которой вы находитесь, и той, к которой вы хотите вернуться.

Если все выглядит хорошо, вы можете зафиксировать.Вы также можете использовать git diff revert..example, чтобы убедиться, что это то же самое.

5 голосов
/ 10 ноября 2017

Если вы хотите временно отменить изменения, потому что

  • кто-то зафиксировал код, нарушающий сборку или нарушающий функционал, над которым вы работаете

Вы можете найтипоследний рабочий коммит, используя git log, затем запустите

git rebase --onto <commitId>

Когда удаленная ветвь снова заработает, вы можете

git pull --rebase

Этот метод лучше, чем git checkout для временных изменений, потому что выВы не в оторванном состоянии.

2 голосов
/ 29 января 2019

Сброс поэтапных изменений и фиксаций

Команда git reset позволяет вам изменить HEAD - последний коммит, на который указывает ваше рабочее дерево вашего репозитория. Он изменяет либо область подготовки, либо область подготовки и рабочее дерево. Способность Git создавать коммиты в точности так, как вы хотите, означает, что вам иногда нужно отменить изменения, внесенные вами с помощью git add. Вы можете сделать это, позвонив по номеру git reset HEAD <file to change>. У вас есть два варианта, чтобы полностью избавиться от изменений. git checkout HEAD <file(s) or path(s)> - это быстрый способ отменить изменения в области подготовки и рабочем дереве. Будьте осторожны с этой командой, потому что она удаляет все изменения в вашем рабочем дереве. Git не знает об этих изменениях, так как они никогда не совершались. Невозможно вернуть эти изменения после запуска этой команды. Другая команда в вашем распоряжении - git reset --hard. Это в равной степени разрушительно для вашего рабочего дерева - любые незафиксированные изменения или поэтапные изменения теряются после его запуска. Запуск git reset -hard HEAD делает то же самое, что и git checkout HEAD. он просто не требует файла или пути для работы. Вы можете использовать --soft с git reset. Он сбрасывает репозиторий в указанный вами коммит и выполняет все эти изменения. На любые изменения, которые вы уже подготовили, это не влияет, равно как и изменения в вашем рабочем дереве. Наконец, вы можете использовать --mixed для сброса рабочего дерева без внесения каких-либо изменений. Это также не выполняет этапные изменения.

Возврат коммитов

Иногда мы совершаем ошибки. Коммит, который не должен был использоваться совместно, помещается в общедоступный репозиторий, в коммите есть ошибка, которую невозможно исправить, и которую необходимо отменить, или, может быть, вам больше не нужен этот код. Вызовите git revert. Команда git revert делает то, что вы могли ожидать. Он отменяет один коммит, применяя обратный коммит к истории. Иногда вам нужно отменить несколько коммитов, чтобы полностью отменить изменение. Вы можете использовать -no-commit, или вы можете использовать -n, чтобы сказать Git выполнить возврат, но не останавливайтесь перед принятием изменения. Это позволяет объединить все возвратные коммиты в один коммит, что полезно, если вам нужно отменить функцию, охватывающую несколько коммитов. Убедитесь, что вы возвращаете коммиты в обратном порядке - сначала самый новый коммит. В противном случае вы можете запутать Git, пытаясь вернуть код, который еще не существует.

...