Вот что нужно знать, из чего все остальное вытекает: кроме случаев, когда git gc
(ну, и вещи git gc
тоже), git никогда ничего не удаляет , только когда-либо добавляет новые вещи .
Допустим, у вас есть ветка, которая выглядит примерно так:
* 9d2e82c handle another temporary failure mode
| * 2afb8a0 (resubmit) checkpoint: resubmit
| * 90dcfbb move definitinon of GRONK to sysdefs
|/
* 1ba7847 treat XML login errors as temporary failures
(это отрезанный и слегка измененный вывод из git lola
: http://blog.kfish.org/2010/04/git-lola.html). Теперь скажите, что я сделал что-то с моей «повторной» веткой, например, неправильный filter-branch
, так что у меня есть две новые фиксации в этой ветке (1234567 и 7654321 или что-то еще). Я понимаю, о нет, я сделалчто-то полностью сломано, и я хочу, чтобы «resubmit» вернулся к указанию на коммит 2afb8a0, который является исходной подсказкой этой ветви.
Этот коммит все еще находится в git , и будетпо крайней мере на несколько месяцев (дольше, потому что у вас есть видимое пользователем имя ветки original/refs/heads/tmp
- попробуйте, например, git log
, вы увидите, что оно там). Найдите идентификатор фиксации - в вашем случае это простос именем original/refs/heads/tmp
- и сделайте там свою точку ветвления.у вас не было имени, вы могли бы сделать git branch -d resubmit
, а затем git branch resubmit 2afb8a0
(для моего собственного примера выше), но вы делаете, поэтому:
git branch -D tmp
git branch -m original/refs/heads/tmp tmp
удалит ваш текущий tmp
ипереименуйте переименованный обратно в tmp
.
(Недавно добавлены новые коммиты filter-branch
, которые, как вы решили, вам не нравятся, все равно будут в вашем хранилище.Как только вы удалите видимые для пользователя имена, срок их действия истечет через 3 месяца, после чего git gc
удалит их.)