Я изучаю, как использовать git в эти дни, и мне приходилось делать много хитов и промахов. Таким образом, мне нужно было удалить и создать заново мои удаленные и локальные репозитории. Есть ли способ вернуться к первой фиксации репо и удалить всю историю после этого? В принципе, чистый сланец для экспериментов.Как откат Git repo для первого фиксации и удаления всей истории
ответ
Я не знаю, как сделать то, что вы просите (можно отбросить назад первый коммит, но не удалять всю историю, так как история будет содержать по крайней мере, что первоначальное обязательство.)
Если бы я тебя, я бы просто удалить удаленный репозиторий и .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.
re: «этот подход не удаляет всю историю». Это правда, что вы не можете избавиться от первоначальной фиксации, но после сброса до первого фиксации вы можете завершить работу с помощью 'git rm *' для очистки файлов (осторожно, если у вас есть измененные файлы), а затем 'git commit -amend -allow-empty -reset-author -date = -m« Исчерпал историю », чтобы очистить информацию первого коммита. – TWiStErRob
Еще одна простая задача, сложная для Git. Разработчики Git должны использовать Stack Overflow в качестве обратной связи в своих циклах SDLC. 18K люди должны указать что-то серьезно неправильно с рабочим процессом Git. Им нужно нанять эксперта по UX, потому что они явно не могут сделать это правильно самостоятельно. – jww
Вы можете сбросить до первого фиксации:
«How to show first commit by 'git log'?» описывает, как найти первую совершить:
git log --pretty=format:%H | tail -1
(работает только, если нет несколько корневых ветвей)
git reset --hard yourFirstCommitSHA1
Обратите внимание, что после сброса, до действительно получите чистый сланц, вы можете просто git init
a ne w repo и скопировать содержимое вашей первой фиксации, которую вы только что сбросили (и добавить и зафиксировать в этом новом репо).
Чтобы сделать чистый сброс, который вы хотите исключить журналы и любые изменения конфигурации и все, что я сделаю это, запрашивая только главный корень в новый репозиторий:
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
(т.е. pretty much what VonC said)
(добавлено --topo-order
для защиты от плохих отметок времени)
Это, кажется, более подробная версия моего ответа ниже, так что +1 – VonC
@ VonC. Я вижу, что теперь я обратил внимание только на действие команд. Я все еще довольно новый, не хотел наступать на тебя, мой ответ был бы лучше, как редактирование для тебя? – jthill
нет. Я нахожу ваш ответ более подробным, и если он работает для op, он заслуживает зеленого тика :) – VonC
Вы можете, конечно, удалить всю историю в текущей ветви с помощью:
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
Просто сдует в каталоге .git
, как только вы проверите свою первую транзакцию. Таким образом:
git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'
Гораздо лучше, чем у меня. Может быть, дать команду, чтобы найти шапку мастера root commit? – jthill
Еще одна простая задача, сложная для Git. Разработчики Git должны использовать Stack Overflow в качестве обратной связи в своих циклах SDLC. 18K люди должны указать что-то серьезно неправильно с рабочим процессом Git. Им нужно нанять эксперта по UX, потому что они явно не могут сделать это правильно самостоятельно. – jww