#git #git-reset
#git #git-сброс
Вопрос:
Предположим, у меня есть master-ветка с некоторыми коммит-кодами, которые я хочу сохранить для последующей документации и ссылок, но удалить их из master (потому что я хочу, чтобы master находился в том же состоянии, что и вышестоящее репозиторий).
Мой подход сейчас заключается в том, чтобы
- Создайте новую ветку из текущего основного состояния
- Сброс (—hard) главного хранилища в состояние, которое также присутствует в вышестоящем репозитории
Теперь мой вопрос:
- Что происходит с новой веткой при удалении ссылочного коммита из главного?
- Или я совершенно не прав в понимании того, как ссылаются на ветки.
Часто ветки отображаются следующим образом, где (насколько я понимаю) D
находится основа новой ветки.
A - B - C - D (master)
(new branch)
Ветка «перебазируется» автоматически или как бы вы это назвали?
Будет ли это тогда выглядеть так?
A - B (master)
C - D (new branch)
Последний и, возможно, самый общий вопрос:
- Является ли мой подход к сохранению состояния в новой ветке и
reset --hard
главной ветке правильным способом достижения моей цели по возвращению моего форка в исходное состояние (фиксацияB
) без объединения моих коммитов (C
иD
)?
Комментарии:
1. коммиты являются неизменяемыми. Обычно вы увидите
A-B-C-D
изменение наA-B-C'-D'
после перебазирования, чтобы отразить тот факт, что, хотя коммитыC
иC'
вносят одинаковые изменения в исходное дерево, это разные коммиты.
Ответ №1:
С веткой ничего не «случится», поскольку ветка в git — это просто легкий, подвижный, одноразовый указатель. Коммиты — это реальная вещь.
Да, общий план хорош, создайте новую ветку, чтобы сохранить самые последние коммиты, сбросьте master туда, где он должен быть (я думаю origin/master
), и эта ссылка на ваши коммиты C, D позволит им остаться навсегда.
Без создания ветки они в конечном итоге были бы собраны как мусор, даже если бы какое-то время оставались в рефлоге.
А также нет, ваши коммиты C и D не будут,, объединены в ваш вышестоящий,,, главный,, если вы будете следовать объявленному курсу действий. Дерзайте.
Ответ №2:
Что происходит с новой веткой при удалении ссылочного коммита из главного?
Ничего.
Ваш вопрос, похоже, основан на непонимании того, что такое ветка. Ответвление — это тип ссылки, отличающийся от других ссылок только тем, что в git есть несколько соглашений о том, куда указывают ответвления и как они перемещаются. Ссылка — это указатель на фиксацию[1].
При сбросе master
вы просто меняете указатель, который является master
ссылкой, чтобы он перестал указывать на D
и начал указывать на B
. Это никак не влияет на указатель, который является new branch
ссылкой.
Коммиты C
и D
все еще существуют, и на них также не влияет сброс master
. Просто она master
больше не указывает на место, из которого к ней можно «добраться» (тогда как раньше D
к ней можно было добраться, потому что на нее master
указывали, и C
к ней можно было добраться через D
родительский указатель).
Но new branch
все еще указывает на D
, поэтому он все еще может достигать C
и D
.
Так что new branch
не перебазируется или что-то в этом роде. Перебазирование — это перезапись и замена коммитов, потому что вы хотите внести те же изменения, что и они, относительно другой начальной точки. Здесь этого не происходит. Перебазируются коммиты, и часто при перебазировании коммитов ссылка добавляется сама собой; но когда мы говорим «перебазировать ветку», это своего рода сокращение от «перебазировать некоторые коммиты, доступные в данный момент из ветки, а затем переместить ветку, чтобы указать на новые коммиты». Но здесь нам ничего этого не нужно; у нас все еще есть наши исходные коммиты.
Другая сторона «ветка — это просто указатель» — коммиты не являются «частью» какой-либо ветки. Они существуют независимо от любых ветвей, которые могут ссылаться на них (хотя git gc
в конечном итоге попытается избавиться от них, если решит, что никто больше не знает, как их найти). Говорят, что фиксация, на которую указывает ветка, и коммиты, к которым можно получить доступ оттуда через родительские указатели, составляют историю ветки… но это все, что касается взаимосвязи.
Итак, чтобы повторить и подвести итог — сброс master
перемещает только указатель. Это не изменяет коммиты и не влияет на другие ветки.
[1] Некоторые ссылки могут иногда указывать на что-то другое, кроме фиксации, но это не слишком важно для данного обсуждения; tl; dr — ветка — это указатель на фиксацию и ничего более
Ответ №3:
Цепочки фиксаций остаются активными, пока что-то указывает на них, или пока они не будут стерты git gc
, и ваша схема топологии до / после сброса верна.