2013-05-11 2 views
13

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

+0

Еще одна простая задача, сложная для Git. Разработчики Git должны использовать Stack Overflow в качестве обратной связи в своих циклах SDLC. 18K люди должны указать что-то серьезно неправильно с рабочим процессом Git. Им нужно нанять эксперта по UX, потому что они явно не могут сделать это правильно самостоятельно. – jww

ответ

21

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

Если бы я тебя, я бы просто удалить удаленный репозиторий и .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.

+0

re: «этот подход не удаляет всю историю». Это правда, что вы не можете избавиться от первоначальной фиксации, но после сброса до первого фиксации вы можете завершить работу с помощью 'git rm *' для очистки файлов (осторожно, если у вас есть измененные файлы), а затем 'git commit -amend -allow-empty -reset-author -date = -m« Исчерпал историю », чтобы очистить информацию первого коммита. – TWiStErRob

+0

Еще одна простая задача, сложная для Git. Разработчики Git должны использовать Stack Overflow в качестве обратной связи в своих циклах SDLC. 18K люди должны указать что-то серьезно неправильно с рабочим процессом Git. Им нужно нанять эксперта по UX, потому что они явно не могут сделать это правильно самостоятельно. – jww

5

Вы можете сбросить до первого фиксации:

«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 и скопировать содержимое вашей первой фиксации, которую вы только что сбросили (и добавить и зафиксировать в этом новом репо).

+0

Благодарим вас за лучшее и эффективное решение. –

+0

Из любопытства: как получить несколько корневых ветвей? – kjo

+0

@kjo Они называются сиротскими ветвями: http://stackoverflow.com/a/19582330/6309 – VonC

3

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

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

+0

Это, кажется, более подробная версия моего ответа ниже, так что +1 – VonC

+0

@ VonC. Я вижу, что теперь я обратил внимание только на действие команд. Я все еще довольно новый, не хотел наступать на тебя, мой ответ был бы лучше, как редактирование для тебя? – jthill

+0

нет. Я нахожу ваш ответ более подробным, и если он работает для op, он заслуживает зеленого тика :) – VonC

0

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

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 
9

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

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

Гораздо лучше, чем у меня. Может быть, дать команду, чтобы найти шапку мастера root commit? – jthill