2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

Как откатить 1 коммит?

У меня есть 2 коммита, которые я не протолкнул:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Как откатить первый (самый старый), но сохранить второй?

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Отсюда: http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Могу ли я просто сделать:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Это то, что мне нужно?

Ответы (9)

99
99
99
2009-09-03 21:32:01 +0000

Самый безопасный и, наверное, самый чистый способ - это интерактивный rebase.

git rebase -i HEAD^^

Или,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

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

Вы можете вернуть коммит с помощью git revert, но это добавит больше сообщений о коммите в историю, что может быть нежелательно. Используйте параметр -n, чтобы сообщить Git'у, что он не будет сразу же возвращать коммит. Вы можете интерактивно переделать реверс и сжать его до предыдущего коммита, чтобы сохранить чистоту.

Если два коммита, с которыми вы работаете здесь, затрагивают один и тот же файл(ы), вы можете увидеть конфликт слияния.

Сброс репозитория с помощью git reset --hard должен быть сделан с осторожностью, так как он не может быть отменён.

Переписание истории должно быть сделано с осторожностью.

54
54
54
2011-08-05 17:52:58 +0000

Это если из http://nakkaya.com/2009/09/24/git-delete-last-commit/ и это работало для меня

Git Delete Last Commit

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

Если вы совершили фиксацию хлама, но не толкнули,

git reset --hard HEAD~1

HEAD~1 - это сокращение для коммита перед головой. В качестве альтернативы вы можете обратиться к SHA-1 хэша, в который вы хотите сбросить хэш. Обратите внимание, что при использовании –hard любые изменения отслеживаемых файлов в рабочем дереве после коммита перед головой будут потеряны.

Если вы не хотите стереть проделанную работу, вы можете использовать опцию --soft, которая удалит коммит, но оставит все изменённые файлы “Изменения для фиксации”, как это делает git.

Теперь, если вы уже нажали и кто-то потянул, что обычно бывает в моём случае, вы не можете использовать git'овский сброс. Однако, вы можете сделать возврат git'а,

git revert HEAD

Это создаст новый коммит, который перевернёт всё, что было введено случайным коммитом.

8
8
8
2009-09-03 21:26:55 +0000

Не-а. Гит-сброс - жесткий вернет тебя в историю. То, что вы ищете, это git-реверт, который отменит любой коммит.

6
6
6
2011-12-12 04:39:48 +0000

Я просто сделал это:

git rebase -i HEAD^^

Я испортил его, так что я сделал

git rebase --abort

Тогда сделал это снова. Потом мне пришлось нажимать так:

git push origin master -f

И это уничтожило коммиты, более новые, чем коммиты, к которым я откатился назад. Сработало отлично.

4
4
4
2010-01-28 03:48:38 +0000

Ссылаясь на комментарий Джтимбермана о том, что git reset --hard не может быть отменено, это не совсем верно. Смотрите здесь: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
4
4
2009-09-03 21:46:37 +0000

Нет, git reset --hard baf8d5e удалит 3368e1c коммит, а HEAD будет baf8d5e после.

Если вы хотите сохранить 3368e1c коммит и удалить bad8d5e коммит, самым простым решением будет сделать “git rebase -i HEAD~2” (т.е. интерактивный rebase из двух последних коммитов). Эта команда запустит редактор сообщений о коммите и вы увидите по одной строке для каждого из двух последних коммитов. Там вы просто удаляете строку bad8d5e и сохраняете. git перепишет вашу историю, а 2-й коммит исчезнет.

Есть и другие полезные команды, которые вы можете использовать в редакторе сообщений о коммитах, такие как squash, edit и т.д. Интерактивная переделка ОЧЕНЬ мощна!

Не делайте этого, если кто-то уже видел эти коммиты (протолкните или вытащите из репозитория)!

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Это вернет каталог из заданного “treeish” для /path/to/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}
  • это единственный способ отменить коммит, если в репо есть только один другой коммит (например, начальный коммит и еще 1). Остальные способы (возврат, rebase) отказываются работать, по крайней мере, начиная с git'а 1.7.5.1.

Если вы последуете за git reset с git gc, то git на самом деле полностью удалит старые данные коммита из репо.

0
0
0
2014-06-13 00:08:14 +0000

Я заставил это работать, вручную редактируя хэш-коды последних коммитов из файлов HEAD в папке репозитория:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

До этого я никогда не мог подтолкнуть к началу операций UNMERGE, которые я выполнял локально. Он продолжал говорить, что “не смог протолкнуть несколько ссылок” в центральный репозиторий.

Похожие вопросы

19
4
12
5
5