2013-05-01 4 views
2

Учитывая это GIT дерево:Должно ли каждое git совершать быть предком ветки?

A <--- B <--- C (HEAD, master) 

является возможность поставить дерево в это состояние:

A <--- B (HEAD, master) <--- C 

(. Там еще нет филиалов или теги, кроме master) Другими словами, может ли commit (C) существуют, не будучи фиксацией, на которую указывает ветка (или тег) или предок фиксации, на которую указывает ветка (или тег)?

(Этот вопрос носит чисто теоретический характер, чтобы помочь мне лучше понять, как мерзавец отрасль работает.)

ответ

2

Конечно,

git checkout -b tmp 
touch whatever.txt 
git add -A 
git commit -m "committed!" 
git checkout master 
git branch -D tmp 

коммита, предшественником которого является нынешний глава мастера теперь все еще доступны, но имя не указывает на него. Вы все равно можете добраться до него, например. с командами reflog.

Другая возможность, учитывая, что C уже существует:

git checkout -b tmp 
git checkout master 
git reset --hard HEAD~1 
git branch -D tmp 
2

Commit C может существовать временно (как оборванные совершить); как только GC произойдет, он будет восстановлен.

Использование:

git fsck --unreachable 

увидеть оборванных совершающее и сгустки. Обратите внимание, что поскольку git имеет понятие reflog, то, что вы описали, сразу не создаст оборванную фиксацию, C будет оставаться в reflog на некоторое время. git поддерживает reflog на случай, если вы совершили ошибку и вам нужно что-то восстановить.

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

  • Нет связанных вопросов^_^