Вопрос: Как я могу отменить 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

То есть?


118
2017-09-03 21:23


Источник


Этот вопрос, кажется, вне темы, потому что речь идет о программном инструменте. Он принадлежит переполнению стека. - Peter Mortensen


Ответы:


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

git rebase -i HEAD^^

Или,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Оттуда вы можете выполнить сквош-фиксацию, которая объединяет одну или несколько коммитов в предыдущую фиксацию. Чтобы полностью удалить фиксацию из истории, удалите строку из списка.

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

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

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

История перезаписи должна выполняться с осторожностью.


91
2017-09-03 21:32



Как удалить фиксацию во время «git rebase»? Есть только 3 команды: выбор, редактирование, сквош. Нет удаления AFAIK. - n179911
полностью удалите строку из списка и удалите эту фиксацию - jtimberman
когда я хотел вернуть изменения, я не хотел оставлять никаких следов. Если вы также не хотите оставлять никаких следов своего возвращения, это лучший способ сделать это. - Phillip Whelan
«Самый безопасный и, возможно, самый чистый способ - это перезагрузить интерактивно» Возможно, нет, если вы не используете vim. Мне повезло, и я понял, как выйти из этого беспорядка. По-прежнему выжить, потому что я должен научиться vim :-) - isimmons
Я бы предложил использовать rebase как можно меньше. Если вы работаете с другими, тогда revert, - boldnik


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

Git Удалить последнее обязательство

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

Если вы совершили ошибку, но не нажали,

git reset --hard HEAD~1

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

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

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

git revert HEAD

Это создаст новую фиксацию, которая отменяет все, введенное   случайное совершение.


46
2017-08-05 17:52



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


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


8
2017-09-03 21:26



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


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

git rebase -i HEAD^^

Я напортачил, поэтому сделал

git rebase --abort

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

git push origin master -f

И он уничтожил коммиты новее, чем комманда, на которую я вернулась. Отлично.


5
2017-12-12 04:39





В отношении комментария jtimberman о git reset --hard будучи недействительным, это не совсем так. Глянь сюда: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1


4
2018-01-28 03:48





Нет, git reset --hard baf8d5e удалит 3368e1c commit и HEAD будут на baf8d5e после этого.

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

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

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


3
2017-09-03 21:46





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

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


2
2017-10-12 09:23





git reset --hard {ref}

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

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


1
2018-02-28 20:17





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

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

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


0
2018-06-13 00:08