Как упоминалось ecdpalma ниже, git 1.7.12+ (Август 2012 г.) улучшил параметр --root
для git rebase
:
«git rebase [-i] --root $tip
» теперь можно использовать для перезаписи всей истории, ведущей к «$tip
», вплоть до корневого коммита.
Это новое поведение изначально обсуждалось здесь:
Я лично считаю, что "git rebase -i --root
" нужно сделать так, чтобы он просто работал, не требуя "--onto
", и позволял вам "редактировать" даже первый в истории.
Понятно, что никто не беспокоился, так как люди намного реже переписывают рядом самое начало истории, чем иначе.
За этим последовал патч.
(исходный ответ, февраль 2010 г.)
Как упоминалось в FAQ по Git (и это ТАК вопрос), идея такова:
- Создать новую временную ветку
- Перемотайте его к фиксации, которую вы хотите изменить, используя
git reset --hard
- Измените эту фиксацию (это будет верхняя часть текущей HEAD, и вы можете изменить содержимое любого файла)
Перебазируйте ветку поверх измененной фиксации, используя:
git rebase --onto <tmp branch> <commit after changed> <branch>`
Уловка состоит в том, чтобы быть уверенным, что информация, которую вы хотите удалить, не будет повторно введена более поздним коммитом в другом месте вашего файла. Если вы подозреваете это, вы должны использовать filter-branch --tree-filter
, чтобы убедиться, что содержимое ни в одном коммите этот файл не содержит разумной информации.
В обоих случаях вы переписываете SHA1 каждого коммита, поэтому будьте осторожны, если вы уже опубликовали ветку, содержимое которой изменяете. Вероятно, вам не стоит этого делать, если ваш проект еще не публичный и другие люди не основали работу на коммитах, которые вы собираетесь переписать.
person
VonC
schedule
22.02.2010