Я просто знакомлюсь с git, а теперь и с тегами git. Исходя из того, что я понял на сегодняшний день, теги - это всего лишь моментальный снимок момента в истории, который мы хотим отслеживать. Например, для номеров версий.

У меня есть клиент, который хочет, чтобы я добавил / перенесу исправление ошибки в версию 1.0, когда мы сейчас находимся на версии 2.0. Идея состоит в том, что когда мы создаем изображение нового бокса v1.0, исправление ошибки включается.

Не знаю, как бы я это сделал.

У меня в репо следующие теги:

v2.0
v1.0
v0.1

Я попытался проверить версию с тегами, выполнив команду

git checkout v1.0

Затем я внес исправления в исправления. А потом я попробовал:

git add .
git commit
git push

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

3
dot 14 Окт 2014 в 17:27
2
Это как-то возможно, я думаю, но это не имеет смысла. Выдвигайте новые версии, которые исправляют ошибки в старых версиях. Так работает концепция.
 – 
Ionică Bizău
14 Окт 2014 в 17:35
1
[...] добавить/обратно перенести исправление ошибки в версию 1.0, когда мы сейчас работаем в версии 2.0. Это потребует перезаписи истории вашего репозитория, начиная с версии 1.0, что не является простой операцией. . Вы уверены, что это то, что вы хотите сделать?
 – 
jub0bs
14 Окт 2014 в 17:35
@IonicăBizău, спасибо. Вот что я хотел обсудить. Из чтения у меня не сложилось впечатление, что теги предназначены для изменения. Итак, если я создам исправление ошибки и зарегистрируюсь в мастере ... как кто-то, начиная с версии 1.0, узнает, что этот патч / исправление ошибки также необходимо применить? Как вы «помечаете» патч как применимый к версиям 1.0 и 2.0?
 – 
dot
14 Окт 2014 в 17:40
1
Вы говорите о поддержке двух версий параллельно? Если это так, вы можете создать v0.1.x, где x принимает значения из 0 в то, что вы хотите. Но различия между версиями отмечены в CHANGELOG. Вот где вы говорите: Ошибка x была исправлена..
 – 
Ionică Bizău
14 Окт 2014 в 18:03
Окей, звучит хорошо. это то, что я буду делать. Благодарю.
 – 
dot
14 Окт 2014 в 19:06

2 ответа

Лучший ответ

Переопределение тега / версии в целом - плохая практика. Поскольку вы хотите исправить ошибку только в более старой версии, способ git заключается в создании нового тега с исправленной ошибкой.

Вот почему у нас есть функция CHANGELOG - она ​​помогает людям видеть различия между версиями / выпусками.

В случае исправления ошибки в старой версии (v0.1.0), в то время как новая версия (v0.2.0) имеет журнал изменений и не может быть синхронизирована со старой, вы, вероятно, захотите создать новый тег как v0.1.1:

# creating v0.1.0
git init
echo "console.log('Hello Wrold')" > main.js
git add .
git commit -m 'Initial commit'
git tag v0.1.0
git remote add origin ...
git push --all
git push --tags
# creating v0.2.0
echo "console.log('Hello Mars')" > main.js
git commit -m 'Hello Mars instead of Hello world' .
git tag v0.2.0
git push --all
git push --tags
# fixing typo from v0.1.0 (edit/add files) and creating v0.1.1
git checkout v0.1.0
echo "console.log('Hello World')" > main.js
git commit -m 'Fixed typo.' .
git tag v0.1.1
git push --tags
# go back to main branch
git checkout master

Фиксация Fixed typo. не появится в ветке master, так как она была добавлена ​​только в тег v0.1.1.


Итак, что, если я хочу переопределить v0.1.0? Если это плохая практика, не значит, что это невозможно. Вместо создания новой версии (git tag v0.1.1) мы можем удалить старую v0.1.0 и создать ее снова, принудительно нажав на удаленном компьютере:

... # fixed typo
git tag -d v0.1.0
git tag v0.1.0
git push --tags -f
# go back to main branch
git checkout master

На GitHub его выпуски будут перечислены следующим образом:

Посмотрим на различия:

$ git diff v0.1.0 v0.2.0 
diff --git a/main.js b/main.js
index 07e8cb2..7b366c5 100644
--- a/main.js
+++ b/main.js
@@ -1 +1 @@
-console.log('Hello Wrold')
+console.log('Hello Mars')
$ git diff v0.1.1 v0.2.0
diff --git a/main.js b/main.js
index ba72797..7b366c5 100644
--- a/main.js
+++ b/main.js
@@ -1 +1 @@
-console.log('Hello World')
+console.log('Hello Mars')
$ git diff v0.1.0 v0.1.1
diff --git a/main.js b/main.js
index 07e8cb2..ba72797 100644
--- a/main.js
+++ b/main.js
@@ -1 +1 @@
-console.log('Hello Wrold')
+console.log('Hello World')
7
Ionică Bizău 14 Окт 2014 в 20:24

Вы путаете tags с commits. Обычно tags аналогичны pointers to commits.

Для вашего сценария типичная модель будет следующей

# Create a release branch for v1 
git checkout -b v1_release v1.0
# make your bug fixes, `git commit`, etc.
emacs foo
git add foo
git commit -m "critical bug fix"
# tag your new release 
git tag v1.1
# push the branch and the tags to the server 
git push ...

Чтобы узнать, в каких версиях есть исправление, используйте git branch --contains FIX_SHA или git tag --contains FIX_SHA

Вы также можете создать ветку v2_release и git merge исправить там.

Я бы никогда не рекомендовал повторно использовать один и тот же номер версии для двух разных изображений кода, которые были записаны на оборудование. Это похоже на кошмар отношений с клиентами и службы поддержки.

2
Andrew C 14 Окт 2014 в 20:55