Как раздавить все git коммиты в один? - PullRequest
396 голосов
/ 01 ноября 2009

Как вы сократите весь свой репозиторий до первого коммита?

Я могу вернуться к первому коммиту, но это оставило бы меня с 2 коммитами. Есть ли способ ссылаться на коммит до первого?

Ответы [ 14 ]

4 голосов
/ 05 июля 2017

Чтобы раздавить с помощью трансплантатов

Добавьте файл .git/info/grafts, поместите туда хеш коммита, который вы хотите сделать своим корнем

git log теперь будет начинаться с этого коммита

Чтобы сделать это 'реальным', запустите git filter-branch

3 голосов
/ 19 июля 2018

создать резервную копию

git branch backup

сброс до указанного коммита

git reset --soft <#root>

затем добавьте все файлы в постановку

git add .

коммит без обновления сообщения

git commit --amend --no-edit

подтолкнуть новую ветку с раздавленными коммитами к репо

git push -f
1 голос
/ 09 мая 2016

Этот ответ улучшен на пару выше (пожалуйста, оцените их), предполагая, что в дополнение к созданию одного коммита (без истории без истории), вы также хотите сохранить все коммиты -данные этого коммита:

  • Автор (имя и адрес электронной почты)
  • Дата создания
  • коммитер (имя и адрес электронной почты)
  • Дата совершения
  • Сообщение в журнале коммитов

Конечно, коммит-SHA нового / одиночного коммита изменится, потому что он представляет новую (не) историю, став бездетным / корневым коммитом.

Это можно сделать, прочитав git log и установив некоторые переменные для git commit-tree. Предполагая, что вы хотите создать один коммит из master в новой ветке one-commit, сохраняя данные коммита выше:

git checkout -b one-commit master ## create new branch to reset
git reset --hard \
$(eval "$(git log master -n1 --format='\
COMMIT_MESSAGE="%B" \
GIT_AUTHOR_NAME="%an" \
GIT_AUTHOR_EMAIL="%ae" \
GIT_AUTHOR_DATE="%ad" \
GIT_COMMITTER_NAME="%cn" \
GIT_COMMITTER_EMAIL="%ce" \
GIT_COMMITTER_DATE="%cd"')" 'git commit-tree master^{tree} <<COMMITMESSAGE
$COMMIT_MESSAGE
COMMITMESSAGE
')
0 голосов
/ 18 апреля 2018

Я обычно делаю это так:

  • Убедитесь, что все зафиксировано, и запишите последний идентификатор фиксации на случай, если что-то пойдет не так, или создайте отдельную ветвь в качестве резервной копии

  • Запустите git reset --soft `git rev-list --max-parents=0 --abbrev-commit HEAD`, чтобы сбросить свою голову до первого коммита, но оставить свой индекс без изменений. Все изменения, произошедшие с момента первого принятия, теперь будут готовы к принятию.

  • Запустите git commit --amend -m "initial commit", чтобы изменить ваш коммит на первый коммит и изменить сообщение о коммите, или если вы хотите сохранить существующее сообщение о коммите, вы можете запустить git commit --amend --no-edit

  • Запустите git push -f, чтобы принудительно нажать ваши изменения

...