Если я проверяю помеченную версию исходного кода без создания ветки, 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, чтобы найти старую вилку.