Как отметил ecdpalmabelow, git 1.7.12+ (август 2012) повысило возможность --root
для git rebase
:
«git rebase [-i] --root $tip
» теперь можно использовать для перезаписи всей истории, ведущей к «$tip
», вплоть до фиксации корня.
Это новое поведение было изначально discussed here:
Я лично думаю, что «git rebase -i --root
» должно быть сделано, чтобы просто работать, не требуя «--onto
», и пусть вас «редактировать» даже первый в истории.
Понятно, что никто не беспокоился, так как люди гораздо реже переписываются в самом начале истории, чем в противном случае.
patch followed.
(оригинальный ответ, февраль 2010)
Как уже упоминалось в Git FAQ (а это SO question), идея:
- Создать новую временную ветвь
- Rewind его к фиксация, которую вы хотите изменить, используя
git reset --hard
- Измените это фиксацию (это будет верхняя часть текущего HEAD, и вы можете изменять содержимое любого файла)
Rebase ветвь на вершине изменилась совершить, используя:
git rebase --onto <tmp branch> <commit after changed> <branch>`
Хитрость заключается в том, чтобы быть уверенным, что информация, которую вы хотите удалить, не повторно на более поздней фиксации где-то еще в вашем файле. Если вы подозреваете, что вам нужно использовать filter-branch --tree-filter
, чтобы убедиться, что содержимое этого файла не содержит каких-либо данных, которые содержат достоверную информацию.
В обоих случаях вы в конечном итоге переписываете SHA1 каждой фиксации, поэтому будьте осторожны, если вы уже опубликовали ветвь, которую вы изменяете.Вы, вероятно, не должны этого делать, если ваш проект еще не открыт, а другие люди не работают на основе коммитов, которые вы собираетесь переписать.
На OS X Mountain Lion с системой установленной мерзавца 1.7.9.6 (Apple Git-31,1) Я поставил '<коммит после изменен>' для быть тем же самым хешем, который я использовал в команде 'git reset -hard'. Помимо этого незначительного изменения, это прекрасно работает, чтобы обновить информацию об авторе во всех транзакциях в репо. – berto
вы можете привести пример того, что должно быть $ tip. 'git rebase -i -root' работал для меня. –
@ RémiBenoit да, '$ tip' может быть любой фиксацией, которую вы хотите. 'master' (что означает' master HEAD' commit) в порядке. – VonC