git reset --soft HEAD~1
должен делать то, что вы хотите. После этого у вас будут первые изменения в индексе (видимые с git diff --cached
), а ваши новейшие изменения не внесены. git status
будет выглядеть так:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
Затем вы можете сделать git add foo.java
и зафиксировать оба изменения одновременно.
git commit --amend
делает; но с гораздо более сложным рабочим процессом. Это не отвечает на вопрос, заданный OP, несмотря на то, что он дает правильное направление (git reset
).git reset --soft HEAD~
Использование:
Это делает «смешанный» сброс по умолчанию, который будет делать то, что вы просили; поместите foo.java в unstaged, удалив самый последний коммит.
источник
git reset --soft
не работа, ноgit reset HEAD^
сделалДля меня следующий способ более читабелен (а значит, предпочтительнее):
Вместо
1
этого может быть любое количество коммитов, которые вы хотите удалить.источник
git reset --soft
только для этого: это какgit reset --hard
, но не касается файлов.источник
git reset
msgstr "это как,git reset --hard
но не трогает файлы." Неgit reset --soft
.git reset --soft
внесет изменения, поэтому вам не нужно будет добавлять их в стадию, если вы хотите их зафиксировать, но вам придетсяgit reset
их (да, во второй раз и без--soft
), если вы этого не сделаете. Так что ответ короткий, но неверный.Для удаления всех файлов в вашем последнем коммите -
git reset HEAD~
источник
«Сброс» - это способ отмены изменений локально. При фиксации вы сначала выбираете изменения для включения в « git add » - это называется «постановка». И после того , как изменения в постановке, то « GIT совершить » их.
Чтобы отступить от постановки или коммита, вы «сбрасываете» ГОЛОВУ. В ветке HEAD - это переменная git, которая указывает на самый последний коммит. Так что, если вы поставили, но не сделали коммит, вы " git reset HEAD " Это поддерживает текущую ГОЛОВУ, снимая изменения со сцены. Это сокращение от " git reset - смешанный HEAD ~ 0 ".
Если вы уже зафиксировали, значит, HEAD уже продвинут, поэтому вам необходимо выполнить резервное копирование к предыдущему коммиту. Здесь вы « сбросите HEAD ~ 1 » или « сбросите HEAD ^ 1 » или « сбросите HEAD ~ » или « сбросите HEAD ^ » - все ссылки на HEAD минус один.
Какой символ лучше, ~ или ^? Думайте о тильде как о едином потоке - когда каждый коммит имеет одного родителя и это просто последовательность изменений в последовательности, вы можете ссылаться на поток обратно, используя тильду, как HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, для родителя, прародителя, прадедушки и т. Д. (Технически это поиск первого родителя в более ранних поколениях).
Когда происходит слияние, коммиты имеют более одного родителя. Вот когда в игру вступает ^ каретка - вы можете помнить, потому что она показывает, что ветви собираются вместе. С помощью каретки HEAD ^ 1 будет первым родителем, а HEAD ^ 2 будет вторым родителем одного коммита - например, мать и отец.
Таким образом, если вы просто возвращаетесь на один прыжок для фиксации с одним родителем, то HEAD ~ и HEAD ^ эквивалентны - вы можете использовать любой из них.
Кроме того, сброс может быть --soft , --mixed или --hard . Мягкий сброс просто возвращает коммит - он сбрасывает HEAD, но не извлекает файлы из предыдущего коммита, поэтому все изменения в рабочем каталоге сохраняются. И --soft reset даже не очищает сцену (также известную как индекс ), поэтому все файлы, которые были размещены, все еще будут на сцене.
--Mixed сброса (по умолчанию) также не проверяет файлы из ранее фиксации, поэтому все изменения сохраняются, но стадия очищается. Вот почему простой « Git Reset HEAD » очистит сцену.
--Hard сброс сбрасывает ГОЛОВА, и он очищает почву, но он также проверяет все файлы из ранее фиксации и поэтому он переписывает любые изменения.
Если вы отправили коммит в удаленный репозиторий, сброс не сработает. Вы можете выполнить сброс локально, но когда вы попытаетесь передать на удаленный компьютер, git увидит, что ваш локальный заголовок находится за заголовком в удаленной ветви, и откажется от отправки. Вы можете быть в состоянии форсировать толчок, но Git действительно не любит это делать.
Кроме того , вы можете копить свои изменения , если вы хотите сохранить их, проверить ранее фиксации, снимите копить изменения, стадии их, создать новый коммит, а затем нажмите что.
источник
Допустим, вы хотите отменить изменения до n коммитов,
Где фиксируются хэши следующим образом:
Затем выполните следующую команду:
git reset hn
Теперь ГОЛОВА будет в hn + 1. Изменения с h1 на hn будут неизменными.
источник