Как согласовать отстраненную голову и происхождение / мастера? Уже проверил старый хеш

Введение и поиск

Поэтому я думаю, что совершил серьезную ошибку, и я обеспокоен. Я проанализировал форумы на предмет отстраненности и приблизился к поиску ответа, но сценарии слишком специфичны и не применимы к тому, где я нахожусь. Если вы нашли конкретную ветку, которая отвечает на мой вопрос, пожалуйста, напишите мне.

Например: Как я могу согласовать отдельную 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>
Другие вопросы по тегам