Сгладить старую историю в Git - PullRequest
11 голосов
/ 22 декабря 2010

У меня есть проект git, который запускался некоторое время, и теперь я хочу выбросить старую историю, скажем, от начала до двух лет назад. Под выбрасыванием я подразумеваю замену множества коммитов за это время одним коммитом, делающим то же самое.

Я проверил git rebase -i, но это не удаляет другую (полную) историю, содержащую все коммиты из git.

Здесь графическое представление (d - набор изменений):

(base) -> d1 -> d2 -> d3 -> (HEAD)

То, что я хочу, это:

(base) -> d1,d2 -> d3 -> (HEAD)

Как это могло быть сделано? Спасибо.

РЕДАКТИРОВАТЬ

У меня это работает с

git rebase -i cd1e8c9

cd1e8c9 - начальная ревизия (базовая) для сквоша. Затем я использовал fixup, чтобы объединить ревизии вместе. Спасибо.

Ответы [ 4 ]

16 голосов
/ 09 января 2013

Если вы на самом деле не заботитесь о всей истории, другой простой способ сделать это - взять текущую ветвь и создать на этой основе ветвь сироты Затем добавьте все файлы в эту ветку и сделайте один начальный коммит (который потеряет всю историю). Затем его можно отправить в удаленный репозиторий.

Предполагая, что вы находитесь в ветке, которую хотите сгладить. Сначала проверьте, если он чистый:

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 
4 голосов
/ 22 декабря 2010

squash соответствующие коммиты в один, используя git rebase --interactive.

4 голосов
/ 22 декабря 2010

Мне не очень удобно делать ребазинг, поэтому попробуйте это на отдельном клоне, чтобы увидеть, работает ли он, прежде чем делать это на вашем реальном рабочем пространстве.

Вот мои коммиты

noufal@sanitarium% 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

После того, как я закончу, журналы будут выглядеть следующим образом

noufal@sanitarium% git log --pretty=oneline
c76290666c8b868d36290d8f5276b879bb78d05d Added h
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g
051062042e56759d83258c5e90a9876aa6f52764 Added f
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e
21790602bd6c0a009899ea33e64fec63559c0a76 Added it

Это то, что вы ищете?

0 голосов
/ 16 октября 2017

Это может показаться нетрадиционным, но если вас не интересует история, а в репозитории есть только одна ветка master и не были опубликованы на Github.com или других сайтах, вы можете :

  1. Удалить скрытую .git папку в корне репо
  2. git init
  3. Commit

Помните, что первый шаг очистит все данные git, включая ветвление и фиксацию, поэтому, пожалуйста, будьте осторожны.

...