Как отменить локальную фиксацию 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