Как отменить локальный коммит - PullRequest
635 голосов
/ 31 января 2011

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

 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

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

Ответы [ 6 ]

1220 голосов
/ 31 января 2011

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

git reset HEAD~1

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

161 голосов
/ 10 августа 2012

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

git reset --soft HEAD^
28 голосов
/ 10 марта 2017

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

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

It should look like this.

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

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

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

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

12 голосов
/ 02 сентября 2018

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

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

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

git reset --soft commit_id

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

git reset --hard commit_id

В этом разница мягкий и жесткий

8 голосов
/ 29 мая 2018

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

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

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

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

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

1 голос
/ 14 мая 2018

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

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

...