Как отменить локальную фиксацию git

Моя проблема в том, что я изменил файл, например: README, добавил новую строку "это для моей тестовой линии" и сохранил файл, затем я выпустил следующие команды

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

Я не нажимал код на github, теперь я хочу отменить это коммит.

Для этого я использовал

   git reset --hard HEAD~1

Но я потерял недавно добавленную строку "это для моей тестовой линии" из файла README. Этого не должно быть. Мне нужно, чтобы контент был там. Есть ли способ сохранить контент и отменить мой локальный коммит?

Ответ 1

Просто используйте git reset без флага --hard:

git reset HEAD~1

PS: В системах на базе Unix вы можете использовать HEAD^, который равен HEAD~1. В Windows HEAD^ не будет работать, потому что ^ сигнализирует о продолжении строки. Итак, ваше приглашение командной строки просто спросит вас More?.

Ответ 2

Используйте --soft вместо --hard флаг:

git reset --soft HEAD^

Ответ 3

Если вы находитесь в середине коммита (т.е. уже в редакторе), вы можете отменить его, удалив все строки выше первого #. Это прервет коммит.

Таким образом, вы можете удалить все строки, чтобы сообщение о фиксации было пустым, а затем сохранить файл:

It should look like this.

Затем вы получите сообщение, в котором говорится об Aborting commit due to empty commit message. ,

РЕДАКТИРОВАТЬ:

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

Чтобы удалить все строки в vim (если это ваш редактор по умолчанию), попав в редактор, введите gg чтобы перейти к первой строке, затем dG чтобы удалить все строки. Наконец, напишите и выйдите из файла с помощью wq и ваш коммит будет прерван.

Ответ 4

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

--soft: будут сброшены только коммиты, а индекс и рабочий каталог не будут изменены.

--mixed: это приведет к сбросу индекса в соответствии с заголовком, при этом рабочий каталог не будет затронут. Все изменения останутся в рабочем каталоге и появятся как измененные.

--hard: сбрасывает все (коммиты, индекс, рабочий каталог) в соответствии с заголовком.

В вашем случае я бы использовал git reset --soft чтобы сохранить ваши измененные изменения в индексе и рабочем каталоге. Не забудьте проверить это для более подробного объяснения.

Ответ 5

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

Используйте git log чтобы показать текущие сообщения о commit_id, затем найдите commit_id перед коммитом, который вы хотите удалить, а не коммит, который вы хотите удалить.

Если вы хотите сохранить локально измененные файлы и просто удалить сообщение о коммите:

git reset --soft commit_id

Если вы хотите удалить все локально измененные файлы и сообщение о коммите:

git reset --hard commit_id

Что разница мягкая и жесткая

Ответ 6

Используйте команду ниже: $ git reset HEAD ~ 1 После этого вы также можете просматривать файлы, которые возвращаются обратно, как показано ниже.

Неустановленные изменения после сброса: M application/config/config.php M application/config/database.php

Ответ 7

Разница между git reset --mixed, --soft и --hard

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

Давайте возьмем пример:

- A - B - C (master)

HEAD указывает на C а индекс соответствует C

--soft

  • Когда мы выполняем git reset --soft B с целью удаления коммита C и указания главного /HEAD на B.
  • Master/HEAD теперь будет указывать на B, но индекс все еще изменился с C.
  • При выполнении git status вы могли видеть файлы, проиндексированные в коммите C, как поэтапные.
  • Выполнение git commit в этот момент создаст новый коммит с теми же изменениями, что и в C

--mixed

  • Выполнить git reset --mixed B
  • При выполнении master/HEAD будет указывать на B, и индекс также изменяется, чтобы соответствовать B из-за используемого смешанного флага.
  • Если в этот момент мы запустим git commit, ничего не произойдет, так как индекс соответствует HEAD.
  • У нас все еще есть изменения в рабочем каталоге, но, поскольку они отсутствуют в индексе, состояние git показывает их как неперехваченные.
  • Чтобы зафиксировать их, вы должны git add а затем зафиксировать как обычно.

--hard

  • Выполнить git reset --hard B
  • При выполнении master/HEAD будет указывать на B и изменяет ваш рабочий каталог
  • Изменения, добавленные в C, и все незафиксированные изменения будут удалены.
  • Файлы в рабочей копии будут соответствовать коммиту B, это приведет к потере всех изменений, которые были внесены в коммит C, а также к незафиксированным изменениям.

Надеюсь, что сравнение флагов, доступных для использования с командой git reset, поможет кому-то использовать их с умом. Обратитесь к ним для получения дополнительной информации link1 & link2