В одной из моих веток разработки я внес некоторые изменения в свою кодовую базу. Прежде чем я смог завершить функции, над которыми работал, мне пришлось переключить текущую ветку на master, чтобы продемонстрировать некоторые функции. Но просто использование «мастера git checkout» сохранило изменения, которые я также сделал в своей ветке разработки, тем самым нарушив некоторые функции в master. Так что я сделал фиксацию изменений в моей ветке разработки с сообщением фиксации «временная фиксация», а затем извлек мастер для демонстрации.
Теперь, когда я закончил с демонстрацией и вернулся к работе над моей веткой разработки, я хотел бы удалить «временную фиксацию», которую я сделал, при этом сохраняя сделанные мной изменения. Это возможно?
git stash
git stash
это хороший инструмент, одноразовые коммиты «в процессе работы» также являются вполне законным устройством.git stash
какую-то другую ветку в промежуточный период.stash
что он полностью локальный и будет подвержен потере кода в результате удаления, повторного удаления или восстановления, а также аппаратного сбоя или потери. ИМО, это действительно следует использовать только для очень краткосрочного WIP. Любите коммит WIP перед выходом в отпуск: P .. назовите это коммитом свалки мозгов!Ответы:
Это так просто, как это:
Примечание: некоторые оболочки обрабатываются
^
как специальный символ (например, некоторые оболочки Windows или ZSH с включенным глобованием ), поэтому вам может потребоваться процитировать"HEAD^"
в этих случаях .git reset
без--hard
или--soft
перемещает вашHEAD
указатель на указанный коммит, не изменяя никаких файлов.HEAD^
ссылается на (первый) родительский коммит вашего текущего коммита, который в вашем случае является коммитом перед временным.Обратите внимание, что другой вариант - продолжить в обычном режиме, а затем выполнить следующую точку фиксации:
который вместо этого будет редактировать самый последний коммит, имеющий тот же эффект, что и выше.
Обратите внимание, что это (как почти с каждым git-ответом) может вызвать проблемы, если вы уже отправили неверный коммит в место, откуда кто-то другой мог его вытащить. Старайтесь избегать этого
источник
More?
после этого. Все, что яfatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
^
как специальный символ. Вы можете либо цитировать ссылку"HEAD^"
, либо использовать альтернативный синтаксис безHEAD~1
кавычекgit reset HEAD\^
Есть два способа справиться с этим. Что проще, зависит от вашей ситуации
Сброс
Если коммит, от которого вы хотите избавиться, был последним коммитом, и вы не сделали никакой дополнительной работы, которую вы можете просто использовать
git-reset
Возвращает вашу ветку к коммиту как раз перед вашим текущим HEAD. Однако на самом деле это не меняет файлы в вашем рабочем дереве. В результате изменения, внесенные в этот коммит, отображаются как измененные - это похоже на команду «uncommit». На самом деле, у меня есть псевдоним, чтобы сделать это.
Затем вы можете просто использовать
git uncommit
в будущем для резервного копирования одного коммита.давя
Раздавить коммит означает объединение двух или более коммитов в один. Я делаю это довольно часто. В вашем случае у вас зафиксирована функция с половинной готовностью, а затем вы завершите ее и подтвердите снова с соответствующим сообщением о постоянной фиксации.
Я говорю выше, потому что хочу прояснить, что это может быть любое количество коммитов назад. Запустите
git log
и найдите коммит, от которого вы хотите избавиться, скопируйте его SHA1 и используйте его вместо<ref>
. Git переведет вас в интерактивный режим перебазирования. Он покажет все коммиты между вашим текущим состоянием и тем, что вы положили на место<ref>
. Так что если<ref>
10 коммитов назад, он покажет вам все 10 коммитов.Перед каждым коммитом будет слово
pick
. Найдите коммит, от которого вы хотите избавиться, и измените егоpick
наfixup
илиsquash
. Использованиеfixup
просто сбрасывает, что фиксирует сообщение и объединяет изменения в его непосредственного предшественника в списке.squash
Ключевое слово делает то же самое, но позволяет редактировать сообщение фиксации на вновь сочетании фиксации.Обратите внимание, что коммиты будут повторно зафиксированы в том порядке, в котором они отображаются в списке при выходе из редактора. Поэтому, если вы сделали временный коммит, затем выполнили другую работу в той же ветке и выполнили функцию в последующем коммите, то использование rebase позволит вам пересортировать коммиты и раздавить их.
ПРЕДУПРЕЖДЕНИЕ:
Перебазирование изменяет историю - НЕ делайте этого с любыми коммитами, которые вы уже поделились с другими разработчиками.
припрятать
В будущем, чтобы избежать этой проблемы, рассмотрите
git stash
возможность временного хранения незавершенных работ.Это сохранит ваши текущие изменения в списке в вашем тайнике. Выше приведена наиболее явная версия команды stash, в которой можно оставить комментарий, чтобы описать, что вы храните. Вы также можете просто запустить
git stash
и ничего больше, но сообщение не будет сохранено.Вы можете просмотреть свой список тайников с ...
Это покажет вам все ваши тайники, на каких ветвях они были сделаны, а также сообщение и в начале каждой строки, а также идентификатор этого тайника, который выглядит следующим образом,
stash@{#}
где # - его позиция в массиве тайников.Чтобы восстановить тайник (что можно сделать в любой ветке, независимо от того, где изначально был создан тайник), вы просто запускаете ...
Опять же, # это позиция в массиве тайников. Если тайник, который вы хотите восстановить, находится в
0
положении - то есть, если это был последний тайник. Затем вы можете просто запустить команду, не указывая положение тайника, git будет предполагать, что вы имеете в виду последнее:git stash apply
.Так, например, если я обнаружу, что работаю не с той веткой - я могу выполнить следующую последовательность команд.
В вашем случае вы перемещались по веткам немного больше, но та же идея все еще применима.
Надеюсь это поможет.
источник
git config --global alias.uncommit reset HEAD^
просто псевдонимы uncommit для сброса. Вместо этого делайgit config --global alias.uncommit 'reset HEAD^'
Я думаю, что вы ищете это
git reset --soft HEAD~1
Он отменяет самый последний коммит, в то же время сохраняя изменения, внесенные в этот коммит, на стадии подготовки.
источник
git reset HEAD^
Windows просто появляется сообщение «Еще?» - что бы это ни значило^
- экранирующий символ в DOS. При сопряжении с новой строкой он служит подсказкой продолжения для предыдущей команды. Набор текстаgit reset HEAD^^
должен работать на Windows.Да, вы можете удалить свой коммит, не удаляя изменения: git reset @ ~
источник
git reset --soft
илиgit reset --keep
?Вы ищете
git reset HEAD^ --soft
илиgit reset HEAD^ --mixed
.Есть три режима для команды сброса, как указано в документации :
git reset HEAD^ --soft
отменить
git commit
. Изменения все еще существуют в рабочем дереве (папка проекта) + индекс (--cached)git reset HEAD^ --mixed
отменить
git commit
+git add
. Изменения все еще существуют в рабочем деревеgit reset HEAD^ --hard
Как будто вы никогда не вносили эти изменения в кодовую базу. Изменения ушли из рабочего дерева.
источник
Для тех, кто использует zsh, вам придется использовать следующее:
git reset --soft HEAD\^
Объясняется здесь: https://github.com/robbyrussell/oh-my-zsh/issues/449
В случае, если URL становится мертвым, важная часть:
источник
git reset HEAD^
работает в Zsh для меня, возможно, было исправлено.zsh 5.3 (x86_64-apple-darwin18.0)
В моем случае я уже подтолкнул к репо. Ой!
Вы можете отменить определенный коммит, сохранив изменения в локальных файлах, выполнив:
Таким образом, я смог сохранить необходимые изменения и отменить коммит, который уже был передан.
источник
git revert bad-commit-sha
потомgit revert -n revert-commit-just-created-sha
отремонтировать оттуда. Ты получил меня на полпути. Спасибо!Использование git 2.9 (точно 2.9.2.windows.1) требует
git reset HEAD^
большего; не уверен, что ожидаемый вклад здесь. Пожалуйста, смотрите ниже скриншотНашел другое решение
git reset HEAD~#numberOfCommits
с помощью которого мы можем выбрать количество локальных коммитов, которые вы хотите сбросить, сохранив ваши изменения без изменений. Следовательно, мы получаем возможность отбросить все локальные коммиты, а также ограниченное количество локальных коммитов.Смотрите ниже скриншоты, показывающие
git reset HEAD~1
в действии:источник
Еще один способ сделать это.
Добавьте коммит поверх временного коммита и затем выполните:
Чтобы объединить два коммита в один (команда откроет текстовый файл с явными инструкциями, отредактируйте его).
источник
git reset HEAD^
. Git rebase имеет много места для ошибки здесь.2020 простой способ:
(Хэш коммита последнего коммита, который вы хотите сохранить).
Если коммит был выдвинут, вы можете сделать:
Вы будете хранить незафиксированные изменения локально
источник