Как я могу откатить 1 коммит?

244996
n179911

У меня есть 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 

То есть?

119
Этот вопрос кажется не по теме, потому что речь идет об инструменте программирования. Это относится к переполнению стека. Peter Mortensen 9 лет назад 3
@PeterMortensen Согласен. Это подходит для SuperUser Kolob Canyon 5 лет назад 0

9 ответов на вопрос

92
jtimberman

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

git rebase -i HEAD^^ 

Или же,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^ 

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

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

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

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

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

Как я могу удалить коммит во время 'git rebase'? Есть только 3 команды: выбрать, редактировать, сквош. Там нет удалить AFAIK. n179911 14 лет назад 0
удалить строку из списка полностью, и он удаляет этот коммит jtimberman 14 лет назад 8
когда я хотел отменить изменение, я хотел оставить его след. Если вы также хотите оставить следы своего восстановления, это лучший способ сделать это. Phillip Whelan 13 лет назад 0
«Самый безопасный и, вероятно, самый чистый способ - это перебазировать в интерактивном режиме». Возможно, нет, если вы не используете vim. Мне повезло, и я решил выйти из этого беспорядка. Все еще голосую, потому что я должен учиться vim :-) isimmons 10 лет назад 0
Я бы предложил использовать `rebase` как можно меньше. Если вы работаете с другими, просто сделайте `revert`. boldnik 10 лет назад 0
@isimmons никто не вынужден использовать vi / vim; Есть несколько способов перейти на другой редактор, такой как nano или emacs: http://stackoverflow.com/questions/2596805/how-do-i-make-git-use-the-editor-of-my-choice-for- совершает Daniel Alder 7 лет назад 0
48
iStryker

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

Git Удалить последний коммит

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

Если вы совершили мусор, но не столкнулись,

git reset --hard HEAD~1

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

Если вы не хотите уничтожать проделанную вами работу, вы можете использовать --softопцию, которая удалит коммит, но оставит все ваши измененные файлы «Изменения будут зафиксированы», как сказал бы git status.

Теперь, если вы уже нажали, а кто-то нажал, что обычно является моим случаем, вы не можете использовать git reset. Вы можете, однако, сделать мерзавец,

git revert HEAD

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

С опцией --soft, он идеально подходит для того, где вы переименовываете файл и случайно «git commit -a», вместо того, чтобы сначала использовать «git add». Aaron Harun 10 лет назад 2
8
Peltier

Нету. git-reset --hard вернет вас в историю. То, что вы ищете, это git revert, который отменит любой коммит.

Ну, это работает, но это также загрязняет ваш журнал коммитов. Если эти коммиты не были уже сдвинуты / вытянуты, лучше очистить их с помощью интерактивной перебазировки. Возможность изменять историю - одно из главных преимуществ git перед другими системами контроля версий. knweiss 14 лет назад 4
5
hamstar

Я только что сделал это:

git rebase -i HEAD^^ 

Я облажался, так что я сделал

git rebase --abort 

Затем сделал это снова. Тогда я должен был толкать так:

git push origin master -f 

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

4
mattd

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

3
knweiss

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

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

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

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

2
lokeshpahal
git checkout <treeish> -- /path/to/dir 

That will bring back the directory from the given “treeish” for the /path/to/dir

1
squeegee
git reset --hard 

это единственный способ отменить коммит, если в репо есть только один коммит (например, начальный коммит и еще 1). Остальные способы (revert, rebase) отказываются работать, по крайней мере, с git 1.7.5.1.

Если вы выполните « git reseta», git gcто git фактически полностью удалит старые данные коммита из репозитория.

0
Leandro M

I got this to work by manually editing the hash codes of the last commits from HEAD files inside the repository folder:

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

Before that, I was never able to push to origin the UNMERGE operations I did locally. It kept saying it "failed to push some refs" to Central Repository.

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