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

127

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

Это?

n179911
источник
3
Этот вопрос кажется не по теме, потому что речь идет об инструменте программирования. Это относится к переполнению стека.
Питер Мортенсен
@PeterMortensen Согласен. Это относится к SuperUser
Каньон Колоб

Ответы:

95

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

git rebase -i HEAD^^

Или же,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

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

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

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

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

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

jtimberman
источник
Как я могу удалить коммит во время 'git rebase'? Есть только 3 команды: выбрать, редактировать, сквош. Там нет удалить AFAIK.
n179911
8
полностью удалить строку из списка, и она удалит этот коммит
jtimberman
когда я хотел отменить изменение, я хотел оставить его след. Если вы также хотите оставить следы своего возврата, это лучший способ сделать это.
Филипп Уилан
«Самый безопасный и, вероятно, самый чистый способ - это перебазировать в интерактивном режиме». Возможно, нет, если вы не используете vim. Мне повезло, и я решил выйти из этого беспорядка. Все еще голосую, потому что я должен учиться vim :-)
isimmons
Я бы предложил использовать rebaseкак можно меньше. Если вы работаете с другими, то просто зарабатывайте revert.
Болдник
52

Это если с 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

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

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

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

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

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

git rebase -i HEAD^^

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

git rebase --abort

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

git push origin master -f

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

hamstar
источник
4

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

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

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

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

knweiss
источник
1
git reset --hard {ref}

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

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

резиновая швабра
источник
1
git checkout <treeish> -- /path/to/dir

Это вернет каталог из указанного «дерева» для / path / to / dir

lokeshpahal
источник
0

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

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

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

Леандро М
источник