У меня есть 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
Это?
Ответы:
Самый безопасный и, вероятно, самый чистый путь - это интерактивная перебазировка.
Или же,
Оттуда вы можете сдавить коммиты, которые помещают один или несколько коммитов в предыдущий коммит. Чтобы полностью удалить коммит из истории, удалите строку из списка.
Вы можете отменить коммит,
git revert
но он добавит больше сообщений коммита в историю, что может быть нежелательно. Используйте-n
параметр, чтобы сказать Git не совершать возврат сразу. Вы можете перебазировать в интерактивном режиме и раздавить их до предыдущего коммита, чтобы сохранить вещи в чистоте.Если два коммита, с которыми вы здесь работаете, влияют на один и тот же файл (-ы), вы можете увидеть конфликт слияния.
Сброс хранилища с помощью
git reset --hard
должен быть сделан с осторожностью, так как это не может быть отменено.Переписывать историю следует с осторожностью.
источник
rebase
как можно меньше. Если вы работаете с другими, то просто зарабатывайтеrevert
.Это если с http://nakkaya.com/2009/09/24/git-delete-last-commit/ и у меня это сработало
источник
Нет. git-reset --hard вернет вас в историю. То, что вы ищете, это git revert, который отменит любой коммит.
источник
Я только что сделал это:
Я облажался, так что я сделал
Затем сделал это снова. Тогда я должен был толкать так:
И это уничтожило коммиты, более новые, чем коммит, на который я откатился. Работал отлично.
источник
Нет,
git reset --hard baf8d5e
удалит3368e1c
коммит и HEAD будет наbaf8d5e
потом.Если вы хотите сохранить
3368e1c
коммит и удалитьbad8d5e
коммит, самое простое решение - это сделать "git rebase -i HEAD~2
" (то есть интерактивное перебазирование последних двух коммитов). Эта команда запустит ваш редактор сообщений о коммите, и вы увидите одну строку для каждого из двух последних коммитов. Там вы просто удаляетеbad8d5e
строку фиксации и сохраняете. git перезапишет вашу историю, и второй коммит исчезнет.Есть и другие полезные команды, которые вы можете использовать в редакторе сообщений о коммитах, например
squash
,edit
и т. Д. Интерактивная перебазировка ОЧЕНЬ мощна!Не делайте этого, если кто-то уже видел эти коммиты (нажмите или потяните из вашего репозитория)!
источник
Что касается комментария Джтимбермена о
git reset --hard
том, что его нельзя отменить, то это не совсем так. Смотрите здесь: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1источник
это единственный способ отменить коммит, если в репо есть только один коммит (например, начальный коммит и еще 1). Остальные способы (revert, rebase) отказываются работать, по крайней мере, с git 1.7.5.1.
Если вы выполните команду «
git reset
a»,git gc
то git фактически полностью удалит старые данные коммита из репозитория.источник
Это вернет каталог из указанного «дерева» для / path / to / dir
источник
Я получил это, чтобы работать, вручную редактируя хэш-коды последних коммитов из HEAD-файлов внутри папки репозитория:
До этого мне никогда не удавалось заставить UNMERGE выполнять операции, которые я выполнял локально. Он продолжал говорить, что «не смог подтолкнуть некоторые ссылки» в Центральный репозиторий.
источник