Git - Переключение между тегами

У меня проблема, когда я пытаюсь проверить другой тег на том же коммите.

Это становится проблемой в приложении, где я проверяю, где находится отдельная голова.

Я полагаю, что это потому, что коммит помечен как 4.1, так и 4.1.1, но мне нужно, чтобы руководитель явно сказал "HEAD отсоединен в 4.1", когда я проверяю теги /4.1 из тега 4.1.1 не отображаются одинаково " ГОЛОВА отделена в 4.1.1 "текст.

Невозможно обновить отдельную головку с 4.1 -> 4.1.1

4.1.1 -> 4.1 4.1">

Невозможно обновить отдельную головку с 4.1.1 -> 4.1

4.1.1 -> 4.1 4.1">

В последней проверке я не могу переключиться с 4.1 на 4.1.1, возможно, потому что HEAD уже находится в коммите, есть ли какой-то способ заставить "HEAD отсоединиться в N", не как в этом случае проверять ветку master, а затем проверять тег

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

1 ответ

Решение

TL;DR: по-видимому, вам придется обманывать. Я не рекомендую делать это, но покажу, как это будет работать, ниже.

В последней проверке я не могу переключиться с 4.1 на 4.1.1, возможно, потому что HEAD уже находится в коммите...

Более или менее да. Точнее сказать, что "переключение" с 4.1 на 4.1.1 вообще ничего не переключает, потому что 4.1 и 4.1.1 - это один и тот же коммит. Git использует ярлык и вообще ничего не пишет, потому что ничего не нужно писать. Ну, это, кроме:

есть ли способ заставить "HEAD отделить в N", не проверяя ветку master в этом случае, а затем проверяя тег.

"Отделенный в / от", который git status Отчеты основаны на следе хлебной крошки, оставленной в HEAD рефлог. Когда ты бежишь git checkout X для некоторых обновлений X и Git HEAD, Git сначала сохраняет текущее значение HEAD в рефлог для HEAD вместе с комментарием, таким как этот:

8858448bb4 HEAD@{0}: checkout: moving from pu to master

(pu это ветвь "предложенное обновление" или "раскладка" в Git-репозитории для самого Git, поэтому приведенная выше запись является результатом моего выполнения git checkout pu, который создал pu от origin/pu и дал ему значение 8265814db9543fbaf50c4db8133671ce64dc1ae4, а потом git checkout master, Движение от мастера к вновь созданному pu сделал HEAD@{1} чей комментарий checkout: moving from master to pu.)

когда HEAD оторван, что git status делает, чтобы получить root права через reflog для HEAD попытаться найти ветку или тэг, которые вы явно извлекли, прежде чем приступить к выполнению какого-либо коммита, в котором вы сейчас находитесь. Если фиксация detached-HEAD, в которой вы сейчас находитесь, соответствует значению этой ветви или имени тега, вы detached at Y где Y приходит из комментария. Если коммит с отсоединенной головой, на котором вы сейчас находитесь , не соответствует (или, возможно, не соответствует) @{0}), git status отчеты detached from Y вместо detached at Y,

Итак, если бы вы могли обновить reflog, вы могли бы получить git status сообщить что-то новое. Очевидный способ сделать это git update-ref, но я попробовал. Вот что случилось. Сначала мы настроим ситуацию:

$ git checkout v2.18.0
[snip]
HEAD is now at 53f9a3e157 Git 2.18
$ git tag haha
$ git checkout haha
HEAD is now at 53f9a3e157 Git 2.18
$ git reflog | head -1
53f9a3e157 HEAD@{0}: checkout: moving from master to v2.18.0

и конечно git status сообщает "отключено в v2.18.0". Так:

$ git update-ref -m "moving from v2.18.0 to haha" HEAD HEAD
$ git reflog | head -1
53f9a3e157 HEAD@{0}: checkout: moving from master to v2.18.0

Увы, git update-ref также взял ярлык и не удосужился обновить рефлог. (Возможно git checkout haha действительно вызывал код обновления reflog, но это заняло ярлык.) Итак, пришло время обманывать - обратите внимание, что я не советую, чтобы кто-то действительно делал это! - зная, что обновление журнала HEAD просто добавляет строку в .git/logs/HEAD:

$ ed .git/logs/HEAD 
16108
$t$
$s/from master to v2.18.0/from v2.18.0 to haha/ 
w
16281
q
$ git reflog | head -2
53f9a3e157 HEAD@{0}: checkout: moving from v2.18.0 to haha
53f9a3e157 HEAD@{1}: checkout: moving from master to v2.18.0
$ git status
HEAD detached at haha
nothing to commit, working tree clean

$t$ команда продублировала последнюю строку; затем $s/from master to v2.18.0/from v2.18.0 to haha/ заменил комментарий новым комментарием. А сейчас git status сообщает, что мы хотим сообщить.

Это довольно ясно, что ошибка git update-ref закорачивает обновление. Это также может быть важной или полезной оптимизацией, но если это так, должен быть какой-то флаг, чтобы включить оптимизацию или принудительно обновить обновление, основываясь на том, какой параметр по умолчанию считается более важным. Ошибка была бы неактуальной, за исключением всего этого git status полагается на вещь reflog.

Другие вопросы по тегам