преобразовать тег git в ветку - PullRequest
2 голосов
/ 29 мая 2020

Я клонировал репозиторий. В репозитории есть несколько веток, но есть еще и тег. Теперь мне поручено работать с версией этого тега.

, однако мне нужно выполнить некоторую интеграцию и сделать еще несколько коммитов из этого тега.

Я не знаю, где в структуре веток находится этот тег, поэтому я хотел бы преобразовать этот тег в ветку (прямо сейчас, после проверки этого тега, я нахожусь в " отдельное состояние "), чтобы позже я мог выполнять слияние коммитов и т.д. c.

Есть ли способ сделать это?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Вы можете просто проверить тег:

git checkout tag_name

, а затем создать из него новую ветку, так как теги доступны только для чтения, и вы только sh вносите изменения в ветку (для исправления ошибок или особенность):

git checkout -b new_branch
2 голосов
/ 29 мая 2020

Тег - это имя фиксации. Как и имя ветки:

$ git rev-parse master
d2ecc46c0981fb829fdfb204604ed0a2798cbe07
$ git rev-parse v2.21.0^{commit}
8104ec994ea3849a968b4667d072fedd1e688642

Теперь вы можете задаться вопросом, что там делает этот ^{commit}. Это потому, что тег часто также является именем объекта аннотированного тега , который затем называет фиксацию:

$ git rev-parse v2.21.0
2bb64867dc05d9a8432488ddc1d22a194cee4d31
$ git cat-file -p 2bb64867dc05d9a8432488ddc1d22a194cee4d31
object 8104ec994ea3849a968b4667d072fedd1e688642
type commit
tag v2.21.0
tagger Junio C Hamano <gitster@pobox.com> 1551023739 -0800

Git 2.21
-----BEGIN PGP SIGNATURE-----
[snip]

Если вы хотите запустить ветвь в фиксации, выбранной тегом , просто сделайте это:

git branch newbranch v2.21.0

Вам не нужен ^{commit}, так как git branch сам определяет это для вас:

$ git branch newbranch v2.21.0
$ git rev-parse newbranch
8104ec994ea3849a968b4667d072fedd1e688642

Что вы, вероятно, должны not do - это удалить имя тега и создать новое имя ветки, идентифицирующее правильную фиксацию, или создать имя ветки, такое же, как имя тега. Оба из них разрешены разрешены , но ни один из них не дает положительных результатов.

В частности, как только тег стал доступен, каждый Git репозиторий, который с тех пор получил его. знает , что это имя тега и что это означает , что фиксация. Теперь вы планируете изменить этот факт? Это неприятно для других Git репозиториев.

Между тем, если вы сделаете имя ветки и тега, которые пишутся одинаково, Git не всегда разрешает вещи так, как вы хотите. То есть:

$ git branch v2.21.0 v2.21.0
$ git rev-parse v2.21.0
warning: refname 'v2.21.0' is ambiguous.
2bb64867dc05d9a8432488ddc1d22a194cee4d31

Иногда имя v2.21.0 теперь будет означать ветку имя. Иногда это будет означать тег . Поскольку имена веток, по замыслу, перемещают из одного коммита (старый конец ветки) в другой (новый конец ветки) по мере роста ветки, два имени в будущем будут разрешаться до двух разных коммитов.

Просто используйте другое имя. (И, как ROOT указывает , вы можете создать ветку после проверки тега по имени; или вы можете сделать git checkout -b new-branch tag-name, чтобы сделать все сразу.)

...