Удалить коммиты в Git nad Undo изменения - PullRequest
0 голосов
/ 23 сентября 2019

у меня есть файл (script.js) e с этим кодом:

alert("Hello");

я добавил файл в индекс, а затем передал его:

git add script.js
git commit -m "say hello"

я изменил скрипт наthis

alert("Hello adam");

и затем зафиксировал изменения. Теперь я хочу отменить последний коммит с этим коммандом

$ git reset --soft HEAD~1

, поэтому последний коммит был удален, но файл по-прежнему содержит имя "adam"Почему?я хочу вот что: когда я сбрасываю коммит, я хочу удалить последние изменения в моем файле

Ответы [ 3 ]

2 голосов
/ 23 сентября 2019

git reset имеет три режима: «жесткий», «мягкий» и «смешанный», которые описывают, что происходит с рабочим деревом (т. Е. Вашими файлами) и областью подготовки.

  • --soft оставляет и область подготовки, и ваши файлы в одиночку.
  • --hard отменяет все изменения в области подготовки и файлах.
  • --mixed сбрасывает индекс, но оставляет рабочее дерево в покое.

Имея это в виду, давайте посмотрим на то, что вы сделали.


Допустим, ваш репо выглядит следующим образом.

A - B [master]

Вы совершаетеalert("Hello");, который становится коммитом C.

A - B - C [master]

Вы фиксируете alert("Hello adam");, который становится коммитом D.

A - B - C - D [master]

Вы запускаете git reset --soft HEAD~1.HEAD~1 - это коммит C с alert("Hello");.Таким образом, master вернулся к фиксации C, отменив фиксацию alert("Hello adam");.

Поскольку вы использовали --soft, индекс и файлы останутся прежними.В файлах все равно будет написано alert("Hello adam");, и вы увидите diff.Это дает вам возможность повторить коммит.


Вместо этого, если вы хотите пересмотреть непосредственно предыдущий коммит, используйте git commit --amend.Это переписывает предыдущий коммит.В текущем состоянии с выписанным C и alert("Hello adam"); незафиксированным, вы можете git commit -a переписать коммит C с вашим новым изменением.

A - B - C1 [master]
     \        
      C

Старый C в конечном итоге будет собирать мусор.

В общем, если вы хотите пересмотреть предыдущий коммит, просто внесите свои изменения, а затем git commit --amend внесите их в предыдущий коммит.Более сложное переписывание истории потребовало бы «интерактивного перебазирования».См. Rewriting History в книге Pro Git для получения дополнительной информации.


Кстати, git --soft HEAD~1 является формой «повторить».Это позволяет вам отменить предыдущий коммит, сохранив его изменения, чтобы вы могли редактировать их и фиксировать их заново.Вот несколько полезных псевдонимов, облегчающих понимание этих команд.

[alias]
    # Undo the last commit
    undo = reset --hard HEAD^

    # Undo the last commit, but leave its changes in the working copy
    # so we can redit them.
    redo = reset --soft HEAD^

    # Throw out all changes
    clear = reset --hard HEAD
0 голосов
/ 23 сентября 2019

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

git reset --hard HEAD~1
git push --force

Опция Push with force будет перезаписывать состояние, которое вы имеете в вашем удаленном хранилище для текущей ветки.Обратите внимание, что вам не следует использовать эту команду в публичных ветках (совместно используемых с другими разработчиками), поскольку она, скорее всего, приведет к конфликтам.

0 голосов
/ 23 сентября 2019

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

git reset --hard HashOfCommit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...