Git зафиксировать тег без ветвления

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

Ответ 1

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

$ git reflog
7a30fd7... [email protected]{0}: checkout: moving from master to XXX
ddf751d... [email protected]{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master
96c3b03... [email protected]{2}: commit:  example commit on tag XXX, not on any branch
7a30fd7... [email protected]{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. Таким образом, ваши изменения не были перезаписаны в репозитории, они просто не отображаются в вашем рабочем каталоге, когда вы проверили мастер.

Ответ 2

Да, они будут в логах.

Вы можете назвать ветку в любое время следующим образом:

git checkout -b my-branch-name

Ответ 3

В качестве альтернативы вы можете объединить фиксацию в мастер без новой ветки, найдя ее SHA1 (используя git reflog, как указано выше), а затем:

git checkout master
git merge SHA1

Ответ 4

Чтобы ответить на второй вопрос, который вы использовали бы git reset --hard yourtagname

Что касается того, что произойдет, вы по существу разветвляете свою ветку в тэге и остаетесь в той же ветке. Ваши коммиты в старой вилке все еще там... их просто трудно увидеть. Возможно, вам придется использовать reflog, чтобы найти старую вилку.