Моя проблема в том, что я изменил файл, например: 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. Этого не должно быть. Мне нужен контент, чтобы быть там. Есть ли способ сохранить контент и отменить мой локальный коммит?
git
git-reset
git-commit
Амаль Кумар С
источник
источник
git revert
, что создает новый коммит с обратным дифференциалом от обратного коммита. Сброс просто указывает текущую ветвь на другой коммит, в данном случае тот, что перед коммитом, который вы хотите «забыть».git-commit
может прерваться, если вы оставите сообщение пустым, поэтому, если вы еще не закончили коммит, это может быть полезно.Ответы:
Просто используйте
git reset
без--hard
флага:PS: в системах на основе Unix вы можете использовать
HEAD^
что равноHEAD~1
. На WindowsHEAD^
не будет работать, потому что^
сигнализирует о продолжении строки. Так что ваша командная строка просто спросит васMore?
.источник
--mixed
в руководстве .@^
в качестве сокращенияHEAD^
.Используйте
--soft
вместо--hard
флага:источник
git reset --soft HEAD^
удалит последний локальный (unpushed) совершить , но будет держать изменения , которые вы сделалиgit reset --soft HEAD~
на окнахЕсли вы находитесь в середине коммита (т.е. уже в редакторе), вы можете отменить его, удалив все строки выше первой
#
. Это прервет коммит.Таким образом, вы можете удалить все строки, чтобы сообщение о фиксации было пустым, а затем сохранить файл:
Затем вы получите сообщение, которое говорит
Aborting commit due to empty commit message.
.РЕДАКТИРОВАТЬ :
Вы также можете удалить все строки, и результат будет точно таким же.
Чтобы удалить все строки в vim (если это ваш редактор по умолчанию), как только вы окажетесь в редакторе, напечатайте,
gg
чтобы перейти к первой строке, а затемdG
удалить все строки. Наконец, напишите и выйдите из файла,wq
и ваш коммит будет прерван.источник
rebase -i mybranchname
Первое, что вы должны сделать, это определить, хотите ли вы сохранить локальные изменения, прежде чем удалять сообщение фиксации.
Используйте
git log
для отображения текущих сообщений о коммите, затем найдитеcommit_id
перед коммитом, который вы хотите удалить, а не коммит, который вы хотите удалить.Если вы хотите сохранить локально измененные файлы и просто удалить сообщение о коммите:
git reset --soft commit_id
Если вы хотите удалить все локально измененные файлы и сообщение о коммите:
git reset --hard commit_id
В этом разница мягкого и жесткого
источник
Вы можете указать Git, что делать с вашим индексом (набором файлов, которые станут следующим коммитом) и рабочим каталогом при выполнении сброса git, используя один из параметров:
--soft
: Будут сброшены только коммиты, а индекс и рабочий каталог не изменены.--mixed
: При этом индекс будет сброшен в соответствии с заголовком, а рабочий каталог не будет затронут. Все изменения останутся в рабочем каталоге и появятся как измененные.--hard
: Он сбрасывает все (коммиты, индекс, рабочий каталог) в соответствии с заголовком.В вашем случае я бы использовал
git reset --soft
ваши измененные изменения в индексе и рабочем каталоге. Не забудьте проверить это для более подробного объяснения.источник
Используйте команду ниже:
После этого вы также можете просматривать файлы, которые возвращаются обратно, как показано ниже.
источник