Git commit против тега без ветки


Если я проверяю помеченную версию моего исходного кода без создания ветви, Git указывает, что я вообще не связан с какой-либо ветвью. Он рад позволить мне внести изменения и проверить их, хотя. Куда идут эти изменения? Если я переключусь обратно на "master", они исчезнут (перезаписанные тем, что было в master), и я не могу их снова найти. Что это дает? Если Git позволяет мне совершать изменения против того, что по сути является анонимной веткой, конечно, я могу их вернуть?

4 56

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, чтобы найти старую вилку.