Как я могу отключить свои файлы снова после совершения локального коммита?

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

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

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

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

Ответ 1

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

Ответ 2

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

git reset HEAD^

По умолчанию используется "смешанный" reset, который будет делать то, что вы просили; поместите foo.java в нестационарный, удалив последнюю фиксацию.

Ответ 3

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

Ответ 4

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

git reset HEAD~1

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

Ответ 5

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

git reset HEAD~

Ответ 6

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

Чтобы отказаться от постановки или коммита, вы "сбрасываете" ГОЛОВУ. В ветке HEAD - это переменная git, которая указывает на самый последний коммит. Так что, если вы поставили, но не сделали коммит, вы "git reset HEAD". Это подкрепляет текущий заголовок, снимая изменения со сцены. Это сокращение от "git reset --mixed 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 даже не очищает сцену (также известный как индекс), поэтому все файлы, которые были размещены, все еще будут на сцене.

Сброс --mixed (по умолчанию) также не извлекает файлы из предыдущего коммита, поэтому все изменения сохраняются, но этап очищается. Вот почему простой "Git Reset HEAD" очистит сцену.

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

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

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

Ответ 7

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

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

  • h1
  • х2...
  • кп
  • Hn + 1

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

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