Я только что сделал

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>, и в нем говорится, что моя извлеченная удаленная ветка в ссылках указывает на это в удаленном?

0
Honey 30 Май 2019 в 21:08

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. Ваше имя для удаленного отслеживания 1 origin/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.

1
torek 30 Май 2019 в 23:59

Первая строка сообщает вам, что выборка дала новую ветку в вашем локальном репо, и что у вас есть ГОЛОВА. Второй говорит, что новая ветка настроена на отслеживание удаленной ветки. (Вы можете иметь локальную ветвь с тем же именем, что и удаленная ветвь, но не можете отслеживать удаленную.)

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

1
isherwood 30 Май 2019 в 18:19