Подтвердить что ты не робот

Как откат Git repo для первой фиксации и удаления всей истории

Я изучаю, как использовать git в эти дни, и мне приходилось делать много хитов и промахов. Таким образом, мне нужно было удалить и создать заново мои удаленные и локальные репозитории. Есть ли способ вернуться к первой фиксации репо и удалить всю историю после этого? В принципе, чистый сланец, чтобы экспериментировать.

4b9b3361

Ответ 1

Я не знаю, как сделать то, что вы просите (можно вернуться к первой фиксации, но не удалить всю историю, поскольку история будет содержать хотя бы это начальное коммит.)

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

Ответ 2

Просто удалите каталог .git после того, как вы проверили свою первую фиксацию. Таким образом:

git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'

Ответ 3

Вы можете reset выполнить первый коммит:

"Как показать первую фиксацию с помощью git log '?" описывает, как найти первую фиксацию:

git log --pretty=format:%H | tail -1

(работает только в том случае, если нет ветвей с несколькими корнями)

git reset --hard yourFirstCommitSHA1

Обратите внимание, что после reset, чтобы действительно получить чистый список, вы могли бы просто git init создать новое репо и скопировать содержимое своей первой фиксации только reset (и добавить и зафиксировать в этом новом репо )

Ответ 4

Чтобы сделать чистый reset, вы хотите исключить журналы и любые изменения в конфигурации и все, я бы сделал это, извлекая только основной корень в новое репо:

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 для защиты от вредных временных меток)

Ответ 5

Вы можете удалить всю историю в текущей ветке, используя:

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