Сгладить старую историю в Git
У меня есть проект git, который работает некоторое время, и теперь я хочу выбросить старую историю, скажем, с начала и до двух лет назад. С выбросом я имею в виду замену многих коммитов за это время, когда один сингл делает то же самое.
Я проверил git rebase -i
, но это не удаляет другую (полную) историю, содержащую все коммиты из git.
Здесь графическое представление (d - набор изменений):
(base) -> d1 -> d2 -> d3 -> (HEAD)
Я хочу:
(base) -> d1,d2 -> d3 -> (HEAD)
Как это можно сделать?
Спасибо.
EDIT
Я работал с
git rebase -i cd1e8c9
когда cd1e8c9 является начальной версией (базой) для сквоша. Затем я использовал fixup, чтобы объединить изменения вместе. Спасибо.
Ответы
Ответ 1
Если вы не заботитесь обо всей истории, другой простой способ сделать это - взять текущую ветку и создать на ней сиротскую ветку. Затем добавьте все файлы в эту ветку и сделайте одно начальное коммитирование (которое потеряет всю историю). Затем его можно перенаправить в удаленный репозиторий.
Предполагая, что вы находитесь в ветке, которую хотите сгладить. Сначала проверьте, чист ли он:
git status -s
Вышеприведенная команда не должна выводить ничего.
Теперь создайте сиротскую ветвь:
git checkout --orphan flattened
Добавить все файлы
git add .
Создать одиночную фиксацию
git commit -m "Initial flattened commit"
Проверьте, все ли по желанию, и нажмите на удаленный (ex):
git status -s
# (original_branch being the branch with the full history)
git diff original_branch..flattened
# (assuming your remote is origin and the branch to overide is master)
# Think twice before doing this!
git push origin +flattened:master
Ответ 2
Мне не очень удобно делать перезагрузку, поэтому попробуйте это на отдельном клоне, чтобы увидеть, работает ли это, прежде чем делать это на вашем реальном рабочем пространстве.
Вот мои коммиты
[email protected]% git log --pretty=oneline
967122e7d4e687c0707d25c62cb0d3b6a45d337f Added h
3b82cae737d5fb3317bc7a686a2fdf0fdd9d1c7e Added g
94d89e0455b12e1e4843e64a8f62f3ad6cdf42f3 Added f
a30321b7a367d9b7da6369783650acadbb773cfb Added e
04453f1c90ffde0574c9c8a76f154d741d7d83f4 Added d
ec723a3266e56cc39967bf117154465575905e31 Added c
f415d1f58e2f7bd4beea80ab9acd8309bf5b64e7 Added b
7f1f8d1f903168aa929818a0eb81e0ec7743fb85 Added a
21790602bd6c0a009899ea33e64fec63559c0a76 Added it
Я перезаряжаю 04453f1c90ffde0574c9c8a76f154d741d7d83f4 (Added d)
на 21790602bd6c0a009899ea33e64fec63559c0a76
(первый коммит) и сжимаю их все, и я делаю это с помощью этой команды
git rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 --onto 21790602bd6c0a009899ea33e64fec63559c0a76
После того, как я закончу это, журналы выглядят так:
[email protected]% git log --pretty=oneline
c76290666c8b868d36290d8f5276b879bb78d05d Added h
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g
051062042e56759d83258c5e90a9876aa6f52764 Added f
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e
21790602bd6c0a009899ea33e64fec63559c0a76 Added it
Это то, что вы ищете?
Ответ 3
squash
соответствующая запись совершается с использованием git rebase --interactive
.
Ответ 4
Это может показаться нетрадиционным, но если вы не заботитесь об истории, и в репозитории только один ветвь master
и не были опубликованы на Github.com или на других сайтах, вы могут:
- Удалить скрытую папку
.git
в корне репо
-
git init
- Фиксировать
Помните, что первый шаг очистит все данные git, включая ветку и фиксацию, поэтому будьте осторожны.