Как согласовать отстраненную голову и происхождение / мастера? Уже проверил старый хеш
Введение и поиск
Поэтому я думаю, что совершил серьезную ошибку, и я обеспокоен. Я проанализировал форумы на предмет отстраненности и приблизился к поиску ответа, но сценарии слишком специфичны и не применимы к тому, где я нахожусь. Если вы нашли конкретную ветку, которая отвечает на мой вопрос, пожалуйста, напишите мне.
Например: Как я могу согласовать отдельную HEAD с мастером / источником?
Парень уже сделал git rebase -i
которого у меня нет. Я пытался перебазировать, но это не решило мою проблему.
Немного предыстории:
- Я новичок в Git; Я использую git только сам
- У меня есть удаленный репозиторий
- Нужен старый набор кода, и это была чувствительная ко времени проблема
- Я взял немного программирования и использую его на рабочем месте, где никто не кодирует (поэтому я не могу попросить о помощи)
Выпуск:
Чтобы получить доступ к старому коммиту с рабочим кодом, я сделал (вероятно, неправильную вещь):
git log
git checkout <hash-of-desired-old-commit>
Я приступил к завершению кода. Слава Богу за контроль версий! Но стрелять, почему Git так сложно? Как мне сохранить эту работу? Я сейчас в отрешенной голове. Происхождение / Мастер в некоторых будущих коммитах, которые предпочтительно должны быть удалены.
Что я пробовал:
- скопировал и вставил всю папку в другом месте только для резервного копирования
git add -A
с последующимgit commit -m "oh shit, detached head commit"
а такжеgit rebase master
git reset --hard HEAD~3
за рекомендацию здесь: Оформите старый коммит и сделайте его новым
Вопрос: Как мне примирить мою отдельную голову с источником / мастером? После примирения мне нужно git push --force
или что-то (особенно с --force
флаг)? У этого отдельного руководителя есть работа, и я читал, что чем дольше я жду, тем больше мусора может прийти и съесть мою потерянную ветку. Извините, мне не хватает формального обучения git... Я почти готов просто проверить оригинал мастера, а затем переписать код.
Заранее спасибо.
1 ответ
Если вы находитесь на отдельном HEAD и хотите сохранить любое состояние, в котором находится HEAD, просто создайте ветку:
git branch save-this-head
Теперь у вас есть ветвь, указывающая на этот точно отсоединенный HEAD, поэтому вы можете проверить это безопасно, не теряя ничего:
git checkout save-this-head
И теперь вы больше не находитесь в отключенном состоянии HEAD. Вы и ваши изменения в безопасности! Если у вас есть какие-либо ожидающие изменения, вы должны зафиксировать их сейчас, чтобы мы могли свободно перемещаться.
После этого вы можете просто переназначить эту новую ветку на что-то другое, например, на главную ветку:
git rebase master
Это должно воспроизвести коммиты, которые отсутствуют на master поверх него. Таким образом, изменения, сделанные после отсоединения HEAD, будут восстановлены.
Если вы просто хотите остаться на этом save-this-head
состояние и выбросить предыдущий мастер, вы можете просто проверить мастер и затем сбросить его в состояние сохранения:
git checkout master
git reset --hard save-this-head
Это сделает master
эквивалентно save-this-head
выбрасывая все остальные изменения на master
, Если вы хотите нажать это, вам, вероятно, придется принудительно нажать push, чтобы удалить коммиты с пульта.
Я читал, что чем дольше я жду, тем может быть сбор мусора, который съест мою ветку
Прежде всего, пока вы остаетесь в этом состоянии, указатель HEAD будет продолжать смотреть на этот объект коммита (именно поэтому он называется "отсоединенный HEAD"). Это предотвратит удаление этой коммит-объекта (и всех его родителей) при сборке мусора.
Даже если вы случайно вышли из отключенного состояния HEAD, сделав коммит, на который вы ссылались, "висящим" коммитом, Git будет держать объекты вокруг в течение нескольких недель, прежде чем даже подумать о том, чтобы позволить объекту собирать мусор. И только потому, что он подлежит сборке мусора, это не означает, что GC действительно будет работать, особенно если вы иначе не взаимодействуете с хранилищем.
Btw. в будущем, когда вы захотите вернуться к коммиту в своей истории и ожидать , что вы что-то сделаете (кроме просто просмотра), вы должны просто создать ветку. Даже если это всего лишь временный режим, его наличие позволит вам передвигаться более свободно, и вы не будете разочарованы в том, чтобы что-либо делать из этого отсоединенного состояния HEAD:
git checkout -b fix-something <some-old-hash>