Как я могу снова разархивировать свои файлы после локальной фиксации? - PullRequest
204 голосов
/ 13 июля 2011

Я выполнил следующую команду

git add <foo.java>
git commit -m "add the foo java"

Как я могу удалить свой локальный коммит сейчас и перевести foo.java в неустановленное состояние?

Если я наберу git reset --hard, я обнаружу, что он вернет мой модифицированный файл foo.java к исходному.

Ответы [ 7 ]

353 голосов
/ 13 июля 2011

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 и зафиксировать оба изменения одновременно.

60 голосов
/ 13 июля 2011

Использование:

git reset HEAD^

По умолчанию выполняется «смешанный» сброс, который будет выполнять то, что вы просили;поместите foo.java в unstaged, удалив самый последний коммит.

36 голосов
/ 16 декабря 2015

Для меня следующий способ всегда был более читабельным (а значит, предпочтительным):

git reset HEAD~1

Вместо 1 может быть любое количество коммитов, которые вы хотите удалить.

35 голосов
/ 13 июля 2011

git reset --soft только для этого: он похож на git reset --hard, но не касается файлов.

11 голосов
/ 01 сентября 2017

Для удаления всех файлов в вашем последнем коммите -

git reset HEAD~

3 голосов
/ 26 октября 2018

«Сброс» - это способ отмены изменений локально. При фиксации вы сначала выбираете изменения для включения в « git add » - это называется «подготовка». И после внесения изменений вы " git commit " их.

Чтобы отступить от постановки или коммита, вы «сбрасываете» ГОЛОВУ. В ветке HEAD - это переменная git, которая указывает на самый последний коммит. Так что, если вы поставили, но не сделали коммит, вы " git reset HEAD ." Это подкрепляет текущий заголовок, снимая изменения со сцены. Это сокращение от " git reset - смешанный заголовок ~ 0 ."

Если вы уже зафиксировали, значит, HEAD уже продвинулся, поэтому вам нужно выполнить резервное копирование к предыдущей фиксации. Здесь вы можете " сбросить HEAD ~ 1 " или " сбросить HEAD ^ 1 " или " сбросить HEAD ~ " или " сбросить HEAD ^"- все ссылки на ГОЛОВУ минус один.

Какой символ лучше, ~ или ^? Думайте о тильде как о одном потоке - когда каждый коммит имеет одного родителя и это просто последовательность изменений в последовательности, вы можете ссылаться на поток обратно, используя тильду, как HEAD ~ 1 , HEAD ~ 2, HEAD ~ 3, для родителя, прародителя, прадеда и т. Д. (Технически он находит первого родителя в более ранних поколениях).

Когда происходит слияние, коммиты имеют более одного родителя. Вот когда в игру вступает ^ каретка - вы можете помнить, потому что она показывает, как ветви собираются вместе. С помощью каретки HEAD ^ 1 будет первым родителем, а HEAD ^ 2 будет вторым родителем одного коммита - например, мать и отец.

Так что, если вы просто возвращаетесь на один прыжок для фиксации с одним родителем, то HEAD ~ и HEAD ^ эквивалентны - вы можете использовать любой из них.

Кроме того, сброс может быть - мягкий , - смешанный или - жесткий . Мягкий сброс просто возвращает коммит - он сбрасывает HEAD, но не извлекает файлы из предыдущего коммита, поэтому все изменения в рабочем каталоге сохраняются. И - мягкий сброс даже не очищает сцену (также известный как index ), поэтому все файлы, которые были размещены, все еще будут на сцене.

A - смешанный сброс (по умолчанию) также не извлекает файлы из предыдущей фиксации, поэтому все изменения сохраняются, но этап очищается. Вот почему простой « git reset HEAD » уберется со сцены.

A - жесткий сброс сбрасывает ГОЛОВУ, очищает сцену, но также проверяет все файлы из предыдущего коммита и перезаписывает любые изменения.

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

В качестве альтернативы, вы можете хранить свои изменения, если хотите сохранить их, проверить предыдущий коммит, отменить сохранение изменений, подготовить их, создать новый коммит и затем нажмите это.

0 голосов
/ 22 мая 2019

Допустим, вы хотите отменить изменения до n коммитов,

Где хеши фиксации выглядят следующим образом:

  • h1
  • h2 ...
  • кп
  • кп + 1

Затем выполните следующую команду:
git reset hn

Теперь ГОЛОВА будет в hn + 1. Изменения с h1 на hn будут неизменными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...