Как мне отменить последние локальные коммиты в Git?

Да, это нормальное поведение. Вы в основном читаете в конце файла в первый раз (вы можете сортировать его как чтение ленты), поэтому вы не можете читать больше, если вы не сбросите его, либо используя f.seek(0), чтобы переместить на начало файла или закрыть его, а затем снова открыть его, который начнется с начала файла.

Если вы предпочитаете, вместо этого вы можете использовать синтаксис with, который автоматически закроет файл для вы

, например,

with open('baby1990.html', 'rU') as f:
  for line in f:
     print line

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

20032
задан 82 revs, 54 users 14% 29 August 2019 в 10:48
поделиться

5 ответов

Отменить фиксацию и повторить

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Это то, что вы хотите отменить.
  2. Это не влияет на ваше рабочее дерево (состояние ваших файлов на диске), но отменяет фиксацию и оставляет изменения, которые вы зафиксировали, неустановленными (поэтому они будут отображаться как «Изменения, не поставленные для фиксации» в git status ], поэтому вам нужно будет добавить их снова перед фиксацией). Если вы только хотите добавить дополнительных изменений к предыдущей фиксации или изменить сообщение фиксации 1 , вы можете использовать git reset --soft HEAD ~ вместо этого, который похож на git reset HEAD ~ 2 , но оставляет ваши существующие изменения поэтапно.
  3. Внесите исправления в файлы рабочего дерева.
  4. git add все, что вы хотите включить в свой новая фиксация.
  5. Зафиксируйте изменения, повторно используя старое сообщение фиксации. reset скопировал старую голову в .git / ORIG_HEAD ; commit с -c ORIG_HEAD откроет редактор, который изначально содержит сообщение журнала из старого коммита и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать параметр -C .

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

Если код уже отправлен на ваш сервер и у вас есть права на перезапись истории (перебазирование), то:

git push origin master --force

Вы также можете посмотреть этот ответ:

Как переместить HEAD обратно в предыдущее место? (Отдельная голова) & Отменить коммиты

В приведенном выше ответе будет показано git reflog , которое используется для определения того, какой SHA-1 вы хотите использовать. Как только вы найдете точку, до которой хотите отменить, используйте последовательность команд, как описано выше.


1 Обратите внимание, однако, что вам не нужно возвращаться к более ранней фиксации, если вы только что сделали ошибку в вашем сообщении фиксации . Более простой вариант - git reset (чтобы отключить все изменения, которые вы внесли с тех пор), а затем git commit --amend , который откроет ваш редактор сообщений фиксации по умолчанию, предварительно заполненный последним сообщением фиксации.

2 HEAD ~ совпадает с HEAD ~ 1 . Также см. Что такое HEAD в git? . Это полезно, если вы хотите отменить несколько коммитов.

21983
ответ дан 22 November 2019 в 19:37
поделиться

Добавьте / удалите файлы, чтобы получить желаемое:

git rm classdir
git add sourcedir

Затем внесите изменения в commit:

git commit --amend

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

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

1712
ответ дан 22 November 2019 в 19:37
поделиться
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

или

git reset --hard HEAD~1

Предупреждение. Приведенная выше команда навсегда удалит модификации файлов .java (и любых других файлов), которые вы хотели зафиксировать.

Аппаратный сброс с на HEAD-1 переведет вашу рабочую копию в состояние фиксации перед ошибочной фиксацией.

981
ответ дан 22 November 2019 в 19:37
поделиться

Чтобы изменить последний коммит

Замените файлы в индексе:

git rm --cached *.class
git add *.java

Затем, если это частная ветвь, измените коммит:

git commit --amend

Или, если это общая ветвь, сделайте новый коммит:

git commit -m 'Replace .class files with .java files'


(Чтобы изменить предыдущий коммит, используйте потрясающий интерактивный rebase. )


ProTip™: Добавьте *.class в gitignore, чтобы это больше не повторялось.


Чтобы вернуть коммит

Изменение коммита - идеальное решение, если вам нужно изменить последний коммит, но более общим решением является сброс.

Вы можете сбросить Git на любой коммит следующим образом:

git reset @~N

Где N - количество коммитов до HEAD, а @~ - сброс на предыдущий коммит.

Таким образом, вместо изменения коммита вы можете использовать:

git reset @~
git add *.java
git commit -m "Add .java files"

Посмотрите git help reset, особенно разделы --soft ---mixed и --hard, чтобы лучше понять, что это делает.

Reflog

Если вы что-то напутали, вы всегда можете использовать reflog для поиска пропущенных коммитов:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


746
ответ дан 22 November 2019 в 19:37
поделиться

Для отмены последней локальной фиксации, не выбрасывая ее изменения, у меня есть этот удобный псевдоним в ~/.gitconfig

[alias]
  undo = reset --soft HEAD^

Затем, я просто использую git undo, который суперлегко помнить.

5
ответ дан 22 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: