внесение изменений в один файл в прошлом коммите в git - PullRequest
16 голосов
/ 30 января 2009

Я хочу исправить файл в прошлом коммите. Это может повлиять на все восходящие коммиты.

Есть ли простой способ сделать это? Можете ли вы дать мне руководство, как это сделать?

Много раз, когда я делаю коммит дважды, я обнаруживаю, что у меня произошла ошибка при первом коммите, и я хочу исправить ошибку без необходимости "git reset" моего последнего хорошего коммита.

Для уточнения. Я хочу изменить фактический коммит , то есть я хочу изменить содержимое предыдущего коммита. Я хочу изменить историю!

Ответы [ 2 ]

23 голосов
/ 30 января 2009

Если вы хотите изменить только второй к последнему коммиту (например, не так давно, особенно не до многих веток и слияний), тогда я использую эту процедуру:

  1. git checkout -b tmp bad-commit
  2. исправить файлы
  3. git commit --amend
  4. git rebase tmp master

Если у вас есть слияния между ними, вы можете попробовать rebase -i -p, но результаты могут отличаться.

5 голосов
/ 30 января 2009

Похоже:

  • a filter-branch (сложная команда, которая может делать то, что вы хотите)
  • , а также изменить и перебазировать, как описано в jpalecek . Вы найдете то же решение чуть более подробно в этом другом связанном вопросе .

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

Я также часто перезагружаюсь, чтобы очистить историю разработки, чтобы изменения были правильными и сгруппированы правильно.

Придуманный пример:
Я переименовываю функцию foo в bar и комментирую ее с комментарием «переименовано foo в bar».
Затем я перехожу к следующей функции или исправлению, фиксирую это и перехожу к следующей.
На полпути я обнаружил, что пропустил экземпляр foo!
Я фиксирую свою работу в процессе (или использую git-stash), исправляю отсутствующий 'foo' и фиксирую это, затем использую git-rebase --interactive, чтобы объединить все исправления foo в один чистый коммит.
Если я не использовал git-stash, тогда я буду использовать git-commit --amend (еще одна форма перебазирования), когда я, наконец, закончу функцию, которая была в процессе.

Когда мои патчи отправляются на проверку, все фрагменты верны и рассказывают связную историю. Иногда я использую git-rebase --interactive только для внесения смежных изменений, разделенных по времени, которые влияют на одни и те же биты, чтобы изменения были в контексте.

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