Сгладить старую историю в 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, включая ветку и фиксацию, поэтому будьте осторожны.