Есть два способа справиться с этим. Что проще, зависит от вашей ситуации
Сброс
Если фиксация, от которой вы хотите избавиться, была последней фиксацией, и вы не выполнили никакой дополнительной работы, вы можете просто использовать git-reset
git reset HEAD^
Возвращает вашу ветку к фиксации непосредственно перед вашим текущим HEAD. Однако на самом деле это не меняет файлы в вашем рабочем дереве. В результате изменения, которые были в этой фиксации, отображаются как измененные - это похоже на команду «uncommit». Фактически, у меня есть псевдоним для этого.
git config --global alias.uncommit 'reset HEAD^'
Тогда вы можете просто использовать git uncommit
в будущем для резервного копирования одного коммита.
Сдавливание
Сжатие фиксации означает объединение двух или более коммитов в одну. Я делаю это довольно часто. В вашем случае у вас есть функция, сделанная наполовину, а затем вы завершаете ее и снова фиксируете с правильным, постоянным сообщением о фиксации.
git rebase -i <ref>
Я говорю выше, потому что хочу прояснить, что это может быть любое количество обратных коммитов. Запустите git log
и найдите коммит, от которого хотите избавиться, скопируйте его SHA1 и используйте его вместо <ref>
. Git переведет вас в интерактивный режим перебазирования. Он покажет все коммиты между вашим текущим состоянием и тем, что вы поместили вместо <ref>
. Итак, если <ref>
10 коммитов назад, он покажет вам все 10 коммитов.
Перед каждым коммитом будет слово pick
. Найдите коммит, от которого хотите избавиться, и измените его с pick
на fixup
или squash
. Использование fixup
просто отбрасывает фиксированное сообщение и объединяет изменения с его непосредственным предшественником в списке. Ключевое слово squash
делает то же самое, но позволяет вам редактировать сообщение фиксации вновь объединенной фиксации.
Обратите внимание, что коммиты будут повторно зафиксированы в том порядке, в котором они отображаются в списке при выходе из редактора. Итак, если вы сделали временную фиксацию, затем выполнили другую работу в той же ветке и завершили эту функцию в более поздней фиксации, то использование rebase позволит вам повторно отсортировать фиксации и сжать их.
ВНИМАНИЕ!
Перебазирование изменяет историю - НЕ делайте этого с любыми коммитами, которыми вы уже поделились с другими разработчиками.
Хранение
В будущем, чтобы избежать этой проблемы, рассмотрите возможность использования git stash
для временного хранения незавершенной работы.
git stash save 'some message'
Это сохранит ваши текущие изменения в стороне в вашем списке тайников. Выше представлена наиболее явная версия команды stash, позволяющая в комментарии описать, что вы прячете. Вы также можете просто запустить git stash
и ничего больше, но сообщение не будет сохранено.
Вы можете просмотреть свой список тайников с помощью ...
git stash list
Это покажет вам все ваши тайники, какие ветки они были сделаны, а также сообщение и в начале каждой строки, а также идентификатор этого тайника, который выглядит так stash@{#}
, где # - его позиция в массиве тайников.
Чтобы восстановить тайник (что можно сделать в любой ветке, независимо от того, где изначально был создан тайник), вы просто запускаете ...
git stash apply stash@{#}
Опять же, # это позиция в массиве тайников. Если тайник, который вы хотите восстановить, находится в позиции 0
, то есть если это был самый последний тайник. Затем вы можете просто запустить команду, не указывая позицию тайника, git предположит, что вы имеете в виду последнюю: git stash apply
.
Так, например, если я обнаружу, что работаю не с той веткой, я могу запустить следующую последовательность команд.
git stash
git checkout <correct_branch>
git stash apply
В вашем случае вы немного больше перемещались по веткам, но та же идея все еще применима.
Надеюсь это поможет.
person
eddiemoya
schedule
03.04.2013
git stash
- person Matt Ball   schedule 02.04.2013git stash
- хороший инструмент, незавершенные коммиты - тоже вполне законное устройство. - person kostix   schedule 03.04.2013git stash
в какой-то другой ветке тем временем. - person Alec   schedule 19.12.2017stash
стоит отметить то, что он полностью локален и будет подвержен потере кода из-за повторного удаления или восстановления, а также сбоя или потери оборудования. ИМО, это действительно должно использоваться только для очень краткосрочной WIP. Любите коммит WIP перед тем, как отправиться в отпуск: П ... назовите это коммитом мозговой свалки! - person ϹοδεMεδιϲ   schedule 23.07.2018git checkout -b temp-need-to-run-demo-now
создал временную ветку, а затемgit commit
, но, конечно, это не значит, что это ответ :) - person user776686   schedule 07.04.2019