Да, это нормальное поведение. Вы в основном читаете в конце файла в первый раз (вы можете сортировать его как чтение ленты), поэтому вы не можете читать больше, если вы не сбросите его, либо используя f.seek(0)
, чтобы переместить на начало файла или закрыть его, а затем снова открыть его, который начнется с начала файла.
Если вы предпочитаете, вместо этого вы можете использовать синтаксис with
, который автоматически закроет файл для вы
, например,
with open('baby1990.html', 'rU') as f:
for line in f:
print line
после завершения этого блока, файл автоматически закрыт для вас, поэтому вы можете выполнять этот блок несколько раз, не закрывая явным образом файл самостоятельно и прочитайте этот файл снова.
$ 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)
git status
], поэтому вам нужно будет добавить их снова перед фиксацией). Если вы только хотите добавить дополнительных изменений к предыдущей фиксации или изменить сообщение фиксации 1 , вы можете использовать git reset --soft HEAD ~
вместо этого, который похож на git reset HEAD ~
2 , но оставляет ваши существующие изменения поэтапно. git add
все, что вы хотите включить в свой новая фиксация. 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? . Это полезно, если вы хотите отменить несколько коммитов.
Добавьте / удалите файлы, чтобы получить желаемое:
git rm classdir
git add sourcedir
Затем внесите изменения в commit:
git commit --amend
Предыдущая ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет похоже на то, что вы никогда не допускали ошибки.
Обратите внимание, что вы должны делать это, только если вы еще не нажали. Если вы нажали, вам просто нужно будет зафиксировать исправление в обычном режиме.
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
или
git reset --hard HEAD~1
Предупреждение. Приведенная выше команда навсегда удалит модификации файлов .java
(и любых других файлов), которые вы хотели зафиксировать.
Аппаратный сброс с
на HEAD-1
переведет вашу рабочую копию в состояние фиксации перед ошибочной фиксацией.
Замените файлы в индексе:
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 для поиска пропущенных коммитов:
$ 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
Для отмены последней локальной фиксации, не выбрасывая ее изменения, у меня есть этот удобный псевдоним в ~/.gitconfig
[alias]
undo = reset --soft HEAD^
Затем, я просто использую git undo
, который суперлегко помнить.