2012-03-29 3 views
2

У меня есть две ветки, на которых я обычно работаю: master и homepage_buildout. Недавно мне рассказали, что я проверил старую фиксацию до того, как я работал над проектом. Я просто сделал:git удалить ветку без удаления коммитов

git checkout [commit number] 

Тогда я решил сделать этот старый совершить филиал так:

git checkout -b old_homepage 

Теперь я понял, что мне не нужно, чтобы иметь возможность ссылаться на ветку old_homepage больше , но я все еще хочу, чтобы он существовал как фиксация. Как сохранить эти коммиты, но удалить ветвь появляться при вводе:

git branch 
+0

Вы хотите, чтобы вы объединили свои фиксации в ветке, которую хотите удалить, с помощью мастера? – learnvst

+0

, предполагая, что фиксация является предком 'master' (или любой другой ветви), фиксация не будет удалена, пока ветвь не будет изменена неперемоткой вперед. –

ответ

8

Я думаю что вы на самом деле просят сводится к тому: «если я git branch -d old_homepage будет коммиты заблудиться», и ответ: «Удаление имени удаляет только имя; коммиты сами палки пока вы их видите в git log --all, а на самом деле даже дольше. "

Чтобы визуализировать это лучше, запустите что-то вроде gitk --all или gitk --tags (попробуйте как на сложном git-репозитории). Прокрутите список через фиксации. Теперь представьте себе, что нужно положить заметку на любую фиксацию. Это имя «tag» или «branch». Снимите записку. Commit все еще существует, не так ли? :-)

Это оставляет один очевидный вопрос: когда что-то вроде совершает на самом деле уходит? Ответ: только после того, как вы удалите все имена, которые приводят к ним. Команда gitk (как и большинство других команд git) начинается с имени HEAD. Если вы дадите --all, он добавит все названия ветвей, которые он может найти. Если вы дадите --tags, он добавит все имена тегов, которые он может найти. Затем он работает в обратном порядке, глядя на каждую фиксацию, чтобы увидеть, что другие фиксации (ы), на которые она ссылается.

Git удаляет вещи (коммитты и т. Д.), Когда нет возможности их найти, начиная с одного из этих очевидных имен и обращаясь назад. (Даже тогда он ждет долгое время, от 30 до 90 дней по умолчанию.) Итак, если вы добавите ярлык ветки или тега к старой фиксации, номер которой вы нашли, например, с помощью git log, это дает вам новое очевидное имя для этого число фиксации; но удаление снова безопасно, если только не способ найти его по названию.

+1

Это правильный ответ. Если старая фиксация находится в истории какой-то отрасли, она не исчезнет.Вы можете пометить его, если хотите, для облегчения доступа, но это не обязательно для целей хранения. До тех пор, пока вы не переписываете историю филиала таким образом, чтобы фиксация становилась сиротой (и вам, вероятно, придется пытаться это сделать), фиксация будет продолжаться до тех пор, пока есть некоторые которая имеет его в своей истории. – wadesworld

+0

Спасибо, torek! Это был именно мой вопрос. – Rustavore

2

Вы можете пометить фиксацию:

$ git tag <tagname> <commit-hash> 

Поскольку тег ссылается на обязательство, он не будет получать мусор -collected.

0

Я не совсем уверен, но в этой ситуации вы обычно используете тег.

git tag <some-name> <commit-id> 

Он не будет отображаться в git-branch но git-tag покажет.

Смежные вопросы