я только что сделал
get fetch origin feature/8067
и под ним у меня есть 3 столбца:
* branch feature/8067 -> FETCH_HEAD
* [new branch] feature/8067 -> origin/feature/8067
Пытаясь обработать это ... читая здесь, я только что узнал, что FETCH_HEAD
в основном означает подсказку, где я в последний раз делал fetch
. Файл будет содержать коммит.
Относится ли это [new branch]
к ветке новый, созданной под моим refs/remote
?
Я не уверен, правильно ли я прочитал следующее: feature/8067 -> origin/feature/8067
Является ли 2-й столбец <nameOfBranchOnRemoteRepo>
, а 3-й столбец <repoName/nameOfBranchOnRemoteRepo>
, и в нем говорится, что моя извлеченная удаленная ветка в ссылках указывает на это в удаленном?
Первая строка сообщает вам, что выборка привела к новой ветке в вашем локальном репо и что у вас есть ее HEAD. Во втором говорится, что новая ветка настроена на отслеживание удаленной ветки. (Вы можете иметь локальную ветвь с тем же именем, что и удаленная ветвь, но не отслеживать удаленную.)
Удаленная ветвь не обязательно создавалась там, но могла быть, например, выдвинута другим разработчиком.
Вывод выборки сбивает с толку даже опытного человека. Вот как я их расшифровываю:
* 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
вместо этого добавляется git fetch
). Каждая извлеченная ссылка приводит к появлению одной строки в FETCH_HEAD
, что дает:
not-for-merge
тип и имя ссылки и ее источник:
$ cat .git/FETCH_HEAD
aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6 branch 'master' of git://...
[snipped for length]
Одна строка с пометкой нет, помеченная not-for-merge
, подходит для git pull
скрипта2, чтобы выловить и передать этот хэш-идентификатор в git merge
или git rebase
.
1имя удаленного отслеживания, который в большинстве Git называется отделение дистанционного слежения, представляет собой ссылка в вашем репозитории, полное имя которого начинается с refs/remotes/
и включает имя удаленного устройства, в данном случае origin
, и еще одну косую черту, а затем обычно содержит остальные имени ветвь, как видно на этом пульте.
ссылка — это просто обобщенное имя для веток, тегов, имен удаленного отслеживания, refs/stash
и т. д.: имя в строковом формате, обычно начинающееся с refs/
, которое запоминает один хэш-идентификатор. Для ветки единственный хэш-идентификатор, который запоминает имя, — это фиксация, которую Git должен рассматривать как наконечник этой ветки. Для тега единственный хэш-идентификатор, который запоминает имя, — это либо хэш-идентификатор фиксации, либо хэш-идентификатор аннотированный объект тега, который содержит дополнительную информацию (возможно, включая ключ подписи), а также хэш-идентификатор помеченного объекта (обычно commit, хотя любой тег может указывать на любой из внутренних типов объектов Git).
Git создает имена для удаленного отслеживания через спецификация. Вы можете предоставить refspec при запуске git fetch
. Если вы не укажете refspec, но предоставите удаленный имя, например origin
, Git найдет правильную refspec из вашей конфигурации:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Стандартная конфигурация для origin
всегда имеет точно такую же спецификацию по умолчанию, но есть и некоторые полезные нестандартные конфигурации, такие как созданная git clone --single-branch
. Вы также можете сделать свои собственные совершенно причудливые refspecs, хотя в зависимости от того, насколько вы извращены, некоторые комбинации приведут к неработающему git fetch
.
2Ну, во всяком случае, когда git pull
был сценарием. Он был перекодирован на C для ускорения работы в Windows.
ВОТ ЭТО ДА. Супер спасибо. Это слишком много, чтобы переваривать все сразу во время работы. Чтобы полностью обработать ваш ответ, мне нужно многое изучить. я скоро к вам вернусь
* branch
говорит вам, что это действительно было refs/heads/feature/8067
на удалении, т.е. было веткой кроме * branch
и * [new branch]
какой индикатор существует?
git fetch origin
на любой ветке без ничего после нее?
Помимо * branch
или * [new branch]
вы можете увидеть * tag
или * [new tag]
. Мой вывод git fetch
отображает последний из них — и да, я запустил git fetch
(что переводится как git fetch origin
).
Спасибо. Я получаю 2-ю строку. Мы создали новую ветку. О первой строке. 1) Для чего вносить информацию в FETCH_HEAD
что будет, если этого не сделать? 2) «на удаленке» в какой части 1-й строки есть упоминание «удаленно»?
(1) Цель написания FETCH_HEAD
двояка: (1a) Это то, что git fetch
делал изначально, до того, как были изобретены имена для удаленного отслеживания. В древнем Git (до версии 1.5?) FETCH_HEAD
это место Только для этих хэшей. Это старое поведение остается доступным и сегодня для тех, кто все еще зависит от него. (1b) Пока git pull
не был переписан на C, сценарий git pull
зависел от него. (2) Ничто в первой строке явно ничего не говорит об удаленном, но удаленный является другой репозиторий Git. Будучи репозиторием Git, он имеет ветки и теги. Ваш Git вызвал другой Git. [продолжение]
Другой Git перечислил для вашего Git его ветку, тег и другие ссылочные имена (и их хэш-идентификаторы). Ваш Git выбрал некоторые или все эти ссылки, чтобы скопировать их куда-нибудь в свой собственный Git (и в FETCH_HEAD
). Итак, git fetch
показывает вам имена, которые он видел в Git разное, например feature/8067
. Это сокращает их, но, используя информацию слева, такую как * branch
, мы можем понять, от чего они были сокращены.
Чтобы увидеть, как это работает, запустите git ls-remote origin
и посмотрите на результат. Это первые данные, которые git fetch
получает.
Спасибо. 1) Первая строка сообщает вам, что выборка привела к новой ветке в вашем локальном репо. После этого я сделал
git branch
. Его не было среди моих местных филиалов. 2) Что означает отслеживание удаленного? Я полагаю, это означает, что если я просто сделаюgit fetch
, не упомянув, из какой ветки получить, тогда он будет извлекаться из ветки, из которой он настроен для отслеживания.