Я только что сделал
get fetch origin feature/8067
А под ним я получил 3 столбца:
* branch feature/8067 -> FETCH_HEAD
* [new branch] feature/8067 -> origin/feature/8067
Пытаясь обработать это ... читая здесь, я только что узнал, что FETCH_HEAD
в основном означает подсказку о том, где я последний раз делал fetch
. Файл будет содержать коммит.
Это [new branch]
ссылается на ветку new , созданную в моем refs/remote
?
Я не уверен, правильно ли я прочел следующее: feature/8067 -> origin/feature/8067
Является ли 2-й столбец <nameOfBranchOnRemoteRepo>
, а 3-й столбец - <repoName/nameOfBranchOnRemoteRepo>
, и в нем говорится, что моя извлеченная удаленная ветка в ссылках указывает на это в удаленном?
2 ответа
Вывод извлечения сбивает с толку даже старой руке. Вот как я их декодирую:
* branch feature/8067 -> FETCH_HEAD * [new branch] feature/8067 -> origin/feature/8067
Работа каждой строки справа налево:
Первая строка заканчивается
FETCH_HEAD
, что означает, что ссылка была помещена вFETCH_HEAD
. Смотрите примечание оFETCH_HEAD
ниже. Стрелка жестко закодирована (всегда появляется, и вы можете просто ее игнорировать); имяfeature/8067
- это имя ссылки на пульте дистанционного управления; и* branch
говорит вам, что это действительноrefs/heads/feature/8067
на пульте, то есть ветвь. Поскольку это было депонировано вFETCH_HEAD
, дополнительная информация недоступна.Вторая строка заканчивается
origin/feature/8067
. Ваше имя для удаленного отслеживания 1origin/feature/8067
(полное имяrefs/remotes/origin/feature/8067
) создано или обновлено. Как и раньше, у нас есть стрелка и то же имя. Тогда у нас есть* [new branch]
: это говорит нам о том, чтоorigin/feature/8067
раньше не существовало и чтоfeature/8067
был - как мы уже знаем - именем ветви на удаленном компьютере.
Вот что я получаю, обновляя Git-репозиторий для Git:
ab15ad1a3b..aa25c82427 master -> origin/master ef7435264c..5a294203ad next -> origin/next + f98c0007ae...e49ac33073 pu -> origin/pu (forced update) 0f4b6a451a..ff8db353a4 todo -> origin/todo * [new tag] v2.22.0-rc1 -> v2.22.0-rc1
Опять мы можем работать справа налево:
Мои
origin/master
были созданы или обновлены из ихmaster
. Значение моегоorigin/master
былоab15ad1a3b
, но теперьaa25c82427
. Поскольку было значение, оно было обновлено, а не создано.Мой
origin/next
был создан или обновлен, а все остальное в основном такое же, как указано выше (по модулю очевидных различий).Мой
origin/pu
был обновлен принудительно, то есть это не перемотка вперед, и некоторые коммиты были удалены . Источником была ихpu
ветвь, а мойorigin/pu
раньше былf98c0007ae
, но теперьff8db353a4
. Тот факт, что между двумя хэш-идентификаторами есть три точки, а в других строках - только две точки, означает, что обновление было принудительным, а следовательно, не ускоренной перемоткой вперед. Знак «плюс» в самом начале означает, что обновление было принудительным. (Очевидно, очень важно, чтобы обновление было принудительным: у меня есть три объявления на этот счет!)Мой
origin/todo
был создан или обновлен, и к тому времени, как мы перейдем на левую сторону, это, очевидно, обновление.Мой
v2.22.0-rc1
был создан или обновлен из ихv2.22.0-rc1
; это новый тег
Каждый раз, когда у вас есть новое имя (ветвь, тег или любая другая ссылка), это по определению обычное принудительное создание, и нет доступного old..new
хэша, поэтому левый край будет читать * [new whatever]
.
FETCH_HEAD
особенный: все обновления записываются в .git/FETCH_HEAD
, обычно уничтожая все, что было в нем раньше (но с -a
или --append
, { {X4}} будет добавлено вместо). Каждая извлеченная ссылка приводит к тому, что одна строка появляется в FETCH_HEAD
, давая:
- идентификатор хеша
- необязательная строка
not-for-merge
тип и название ссылки и ее источник:
$ cat .git/FETCH_HEAD aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6 branch 'master' of git://... [snipped for length]
Одна строка, которая не помечена not-for-merge
, подходит для сценария git pull
2 , чтобы выловить и передать этот хэш-идентификатор {{X2} } или git rebase
.
1 имя удаленного отслеживания , которое большая часть Git называет веткой удаленного отслеживания , - это ссылка в ваш репозиторий, полное имя которого начинается с refs/remotes/
и включает в себя имя удаленного, в данном случае origin
и еще один слеш, а затем обычно содержит остальную часть ветви имя, как видно на этом пульте.
ссылка - это просто обобщенное имя для вещей, представляющих собой ветви, теги, имена для удаленного отслеживания, refs/stash
и т. Д.: Имя в формате строки, обычно начинающееся с {{X1} }, который запоминает один хэш-идентификатор. Для ветки один хэш-идентификатор, который запоминает имя, - это коммит, который Git должен считать подсказкой этой ветки. Для тега один хэш-идентификатор, который запоминает имя, является либо хэш-идентификатором фиксации, либо хэш-идентификатором объекта аннотированного тега , который содержит дополнительную информацию (возможно, включая ключ подписи), плюс хэш-идентификатор тегового объекта (обычно коммит, хотя любой тег может указывать на любой из внутренних типов объектов Git).
Git создает имена для удаленного отслеживания через refspec . Вы можете указать refspec при запуске git fetch
. Если вы не предоставляете refspec, но предоставляете удаленное имя , например origin
, Git выдает правильную refspec из вашей конфигурации:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Стандартная конфигурация для origin
всегда имеет эту точную заданную по умолчанию refspec, но есть несколько полезных нестандартных конфигураций, таких как созданная git clone --single-branch
. Вы также можете сделать свои собственные совершенно причудливые refspecs, хотя в зависимости от того, как сильно вы получите, некоторые комбинации приведут к неработоспособности git fetch
.
2 Ну, во всяком случае, тогда, когда git pull
был сценарием. Это было перекодировано в C для скорости на Windows.
Первая строка сообщает вам, что выборка дала новую ветку в вашем локальном репо, и что у вас есть ГОЛОВА. Второй говорит, что новая ветка настроена на отслеживание удаленной ветки. (Вы можете иметь локальную ветвь с тем же именем, что и удаленная ветвь, но не можете отслеживать удаленную.)
Удаленная ветка не была создана там обязательно, но, возможно, была выдвинута другим разработчиком, например.
Новые вопросы
git
Git - это система управления распределенными версиями с открытым исходным кодом (DVCS). Используйте этот тег для вопросов, связанных с использованием Git и рабочими процессами. НЕ ИСПОЛЬЗУЙТЕ тег [github] для решения проблем, связанных с Git, просто потому, что репозиторий размещен на GitHub. Также не используйте этот тег для общих вопросов по программированию, которые связаны с репозиторием Git.