Есть два способа справиться с этим. Что проще, зависит от вашей ситуации
Сброс
Если коммит, от которого вы хотите избавиться, был последним коммитом, и вы не сделали никакой дополнительной работы, которую вы можете просто использовать 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
В вашем случае вы перемещались по веткам немного больше, но та же идея все еще применима.
Надеюсь это поможет.
git stash