Как откатить репозиторий Git до первого коммита и удалить всю историю
В эти дни я учусь пользоваться git, и мне приходилось делать много попаданий. Таким образом мне нужно было заново удалять и создавать свои удаленные и локальные репозитории. Есть ли способ откатиться до первого коммита репо и удалить всю историю после этого? В основном чистый лист, чтобы экспериментировать.
7 ответов
Я не знаю ни одного способа сделать именно то, что вы просите (можно откатиться до первого коммита, но не удалить всю историю, так как история, по крайней мере, будет содержать этот первоначальный коммит).
Если бы я был тобой, я бы просто удалил удаленное репо и .git
каталог локального репо и начать заново с git init
,
Самое близкое, что я могу получить к тому, что вы просите, - это откатить все, кроме первого коммита. Для этого сначала нужно найти SHA1 первого коммита, например:
% git rev-list --max-parents=0 --abbrev-commit HEAD
aa8119f
... а затем запустить
% git reset aa8119f
...или же
% git reset --hard aa8119f
... в зависимости от того, хотите ли вы сохранить или отменить все изменения, сделанные после первоначальной фиксации. (Выше указано, что у вас есть только одна ветвь. Если нет, вам также придется удалить любые другие ветки с git branch -d <BRANCHNAME>
.)
В конце концов, вы бы запустить
% git push -f
(Я надеюсь, что вы понимаете, что git push -f
нет-нет, когда вы подталкиваете к репо, которым делятся с другими.)
К сожалению, как уже объяснялось, такой подход не удаляет всю историю.
Если это то, что вы хотите делать часто, я бы рекомендовал это сразу после git init
запускаешь что-то вроде
% git commit --allow-empty --allow-empty-message -m ''
% git tag -a -m '' ROOT
Это поместит пустой коммит в корень вашей истории и пометит его тегом ROOT. Тогда вы можете сделать что-то вроде
% git reset ROOT
или же
% git reset --hard ROOT
чтобы вернуть вас к тому первому пустому коммиту.
Чтобы получить хорошее представление о том, что git reset
действительно, я рекомендую прочитать это.
Вы можете сбросить до первого коммита:
" Как показать первый коммит с помощью" git log "?" Описывает, как найти первый коммит:
git log --pretty=format:%H | tail -1
(работает только при отсутствии нескольких корневых веток)
git reset --hard yourFirstCommitSHA1
Обратите внимание, что после сброса, чтобы действительно получить чистый лист, вы можете просто git init
новое хранилище и скопируйте содержимое вашего первого коммита, в который вы только что сбросили (и добавили и зафиксировали в этом новом репо)
Просто сдуть .git
каталог, как только вы получили свой первый коммит. В качестве таких:
git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'
Касса для мастера:
$ git checkout master
Показать журнал:
$ git log
Сброс до первой фиксации:
$ git reset --hard <you first commit number>
Затем отправьте изменения на удаленный:
$ git push --force origin
Чтобы сделать чистый сброс, вы хотите удалить журналы и любые изменения конфигурации и все остальное, я бы сделал это, просто загрузив основной корень в новое хранилище:
git tag master-root $(git rev-list --topo-order master|sed '$!d')
git init ../reset-my-repo
cd ../reset-my-repo
git fetch $OLDPWD master-root
git checkout -B master FETCH_HEAD
(т.е. в значительной степени то, что сказал VonC)
(добавлено --topo-order
для защиты от плохих временных отметок)
Вы можете удалить всю историю в текущей ветке, используя:
git reset --hard <commit_id>
где commit_id
это sha1 некоторого исторического коммита.
Однако это редко требуется, если вы учитесь и хотите экспериментировать.
Вместо этого вы можете просто создать новую ветку для ваших экспериментов, например:
git branch experiment <commit_id>
git checkout experiment
...
В большинстве случаев это будет идентично первому варианту, но вы можете переключиться обратно, если хотите.
Вы также можете переименовать ветки, так что ваши эксперименты имеют оригинальные названия веток, например:
git branch -m master backup
git branch master
git checkout master
Если вы хотите ядерное оружие backup
филиал, просто сделайте:
git branch -D backup
Или с помощью сценария оболочки :)
#!/bin/bash
variable=`git rev-list --max-parents=0 --abbrev-commit HEAD`
git reset --hard $variable
git push -f
Если вы отправите это кому-то другому, не забудьте добавить
echo "Ja pie***** cos Ty odje***..."