Я зафиксировал свои изменения в отдельную головку ...
Технически, вы зафиксировали (файлы), пока на отдельном HEAD или в отдельном Режим HEAD , а не «в отдельную ГОЛОВУ». Однако важно то, что вы совершили коммит. Это ключ.
... и [затем] перешел к мастеру.
Это оставило коммит, который вы сделали ранее. Этот коммит, как и любой коммит, имеет уникальный га sh ID: большую уродливую строку букв и цифр, например c7a62075917b3340f908093f63f1161c44ed1475
.
Можно ли оформить заказ снова отсоединённая голова?
Опять же, «отсоединённая ГОЛОВА» - это режим - способ с использованием Git - не коммит. Вопрос, который вам нужен здесь: Могу ли я как-нибудь снова получить этот коммит? Ответ yes , но вы должны найти его ha sh ID или что-то, что находит его ha sh ID.
Самый простой способ найти его га sh ID - это если он все еще на вашем экране. Если вы можете немного прокрутить назад и увидеть , вы можете взять его с помощью мыши, вырезать и вставить, как я взял идентификатор ha sh, который я цитировал выше. Ха sh идентификаторы слишком велики и уродливы для того, чтобы люди могли правильно их вводить, поэтому мы их не используем, но они являются «истинным именем» Git для каждого коммита, поэтому Git использует (и нуждается) в них.
Обычно мы храним их Git для нас. Точно так же, как при использовании метода «вырезать и вставить», мы не пытаемся их вообще вводить: мы просто сообщаем Git , используя имя, например master
, находим мне идентификатор коммита sh и делаем что-то с этим коммитом. Но если вы этого не сделали, ну, есть несколько способов его найти.
Я уже упоминал метод прокрутки назад и смотрим на ваш экран. Другой способ - использовать то, что Git называет reflogs . Каждый раз, когда вы проверяете какой-либо коммит, будь то по имени ветки, или имени тега, или по номеру ha sh, и каждый раз, когда вы делаете новый коммит, так что появляется новый уникальный ha sh Идентификатор в вашем хранилище, Git сохраняет этот идентификатор ha sh как запись в reflog для имени HEAD
. Выполните:
git reflog
, чтобы Git распечатать весь журнал, по одной строке за раз. Вы получите вывод, подобный следующему:
$ git reflog
c7a6207591 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to HEAD
c7a6207591 (HEAD -> master, origin/master, origin/HEAD) HEAD@{1}: merge refs/remotes/origin/master: Fast-forward
083378cc35 HEAD@{2}: checkout: moving from 1d2375ddfee18bd3effd2c1f98527cc2f8b1df0a to master
Крайняя левая строка - это сокращенный идентификатор ha sh. Обратите внимание, что c7a6 ... (что-то), например, начинается с тех же букв и цифр, что и идентификатор ha sh, который я вставил в верхнюю часть этого ответа (c7a62 ... (что-то)). Аббревиатура ha sh ID почти равна 1 так же хорошо, как полная идентификация ha sh. Или вы можете использовать строку HEAD@{<em>number</em>}
, но помните: каждый раз, когда вы запускаете git checkout
или git commit
, все числа go увеличиваются на единицу, потому что Git просто добавляет еще одну запись в журнал. 2
Как только вы найдете идентификатор ha sh или его сокращенную версию или имя, например HEAD@{2}
, вы можете выполнить:
git checkout <hash> # or git checkout HEAD@{2}
и вы Вы будете снова в режиме «отделяемого ГОЛОВА», на этом коммите. Теперь вы можете создать ветвь или имя тега, чтобы иметь Git запомнить идентификатор ha sh для вас.
Если вы не уверены, какой коммит есть какой, запустите git reflog
, чтобы увидеть ха sh идентификаторов (и HEAD@{...}
имен), а затем выполните:
git log <hash-id> # or git log HEAD@{3} or whatever
и git log
покажет вам этот коммит и его предшествующие коммиты, как обычно. Используйте git show <em>hash-id</em>
или git show HEAD@{<em>number</em>}
, чтобы показать этот коммит в деталях.
1 Он терпит неудачу, когда, ну, терпит неудачу: полный идентификатор ha sh определенно совпадает с фактическим идентификатором ha sh, но сокращенный может соответствовать двум или более идентификаторам ha sh. Например, если мы укоротим c7a6 ... что-то до c
, это будет соответствовать c10b ... что-то тоже. Git имеет как минимум 4 символа для сокращенного идентификатора ha sh и обычно начинается с 7, а по мере роста хранилища начинает добавлять больше символов, чтобы надеяться, что сокращенного идентификатора всегда достаточно.
2 Периодически Git будет очищать reflogs. Для каждого ссылки существует один журнал: имя ветви, имя тега или любое другое такое имя - ref или ссылка . Каждый держит один га sh ID. Имена ветвей содержат идентификатор ha sh, который меняется со временем , в то время как имена ваших тегов никогда не должны изменяться.
Записи рефлогов обычно по умолчанию длятся не менее 30 дней, и не менее 90 дней по умолчанию в большинстве случаев. Таким образом, после того, как вы «потеряете» коммит, вы можете получить его как минимум в течение месяца. Вы можете явно включить или отключить reflogs в своем собственном репозитории, но обычно по умолчанию - включено, для вас - правильно. На серверных репозиториях, хранящихся на коммерческих серверах, таких как GitHub, обычно не включены повторные журналы, поэтому здесь нет 30-дневного льготного периода.