Git commit против тега без ветки
Если я проверяю помеченную версию моего исходного кода без создания ветви, Git указывает, что я вообще не связан с какой-либо ветвью. Он рад позволить мне внести изменения и проверить их, хотя. Куда идут эти изменения? Если я переключусь обратно на "master", они исчезнут (перезаписанные тем, что было в master), и я не могу их снова найти. Что это дает? Если Git позволяет мне совершать изменения против того, что по сути является анонимной веткой, конечно, я могу их вернуть?
4 ответа:
потому что commit не находится ни на одной ветке, вы не можете увидеть его в рабочем каталоге, если вы не проверяете эту конкретную фиксацию, используя ее SHA1. Вы можете найти фиксацию, посмотрев на
reflog
который отслеживает изменения в том, что вы проверили из РЕПО. Если ваш тегXXX
вы увидите что-то вроде:$ git reflog 7a30fd7... HEAD@{0}: checkout: moving from master to XXX ddf751d... HEAD@{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master 96c3b03... HEAD@{2}: commit: example commit on tag XXX, not on any branch 7a30fd7... HEAD@{3}: checkout: moving from master to XXX
это говорит вам SHA1, что вам придется
checkout
для того, чтобы увидеть вашу фиксации в рабочем каталоге.$ git checkout 96c3b03 Note: moving to "96c3b03" which isn't a local branch If you want to create a new branch from this checkout, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new_branch_name> HEAD is now at 96c3b03... example commit on tag XXX, not on any branch $ git checkout -b newbranch $ git branch #lists all branches feature1 master * newbranch
все это сначала показалось мне немного странным, пока я не понял, что git
checkout
все файлы проекта как конкретного совершения в мою файловую систему (рабочий каталог). По сути, рабочий каталог действует как браузер в локальном репозитории Git. Так что ваши изменения не были перезаписаны в репозитории, они просто не отображаются в вашем рабочем каталоге, когда вы проверили мастер.
Да, они будут в reflogs.
вы можете назвать ветку в любое время следующим образом:
git checkout -b my-branch-name
кроме того, вы можете объединить фиксацию обратно в master без новой ветви, найдя ее SHA1 (используя git reflog, как указано выше) , а затем:
git checkout master git merge SHA1
чтобы ответить на второй вопрос, вы бы использовали git reset --hard yourtagname
Что касается того, что произойдет, вы по существу разветвили свою ветвь в tagname и остались на той же ветке. Ваши коммиты в старой развилке все еще там... их просто трудно увидеть. Возможно, вам придется использовать reflog, чтобы найти старую вилку.