Как мне прочитать сообщение, которое возвращает git fetch?

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
394
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Спасибо. 1) Первая строка сообщает вам, что выборка привела к новой ветке в вашем локальном репо. После этого я сделал git branch. Его не было среди моих местных филиалов. 2) Что означает отслеживание удаленного? Я полагаю, это означает, что если я просто сделаю git fetch, не упомянув, из какой ветки получить, тогда он будет извлекаться из ветки, из которой он настроен для отслеживания.

mfaani 30.05.2019 20:26
Ответ принят как подходящий

Вывод выборки сбивает с толку даже опытного человека. Вот как я их расшифровываю:

 * 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.

ВОТ ЭТО ДА. Супер спасибо. Это слишком много, чтобы переваривать все сразу во время работы. Чтобы полностью обработать ваш ответ, мне нужно многое изучить. я скоро к вам вернусь

mfaani 30.05.2019 21:18
* branch говорит вам, что это действительно было refs/heads/feature/8067 на удалении, т.е. было веткой кроме * branch и * [new branch] какой индикатор существует?
mfaani 30.05.2019 23:45
Вот что я получаю, обновляя репозиторий Git для Git: вы должны просто делать git fetch origin на любой ветке без ничего после нее?
mfaani 30.05.2019 23:54

Помимо * branch или * [new branch] вы можете увидеть * tag или * [new tag]. Мой вывод git fetch отображает последний из них — и да, я запустил git fetch (что переводится как git fetch origin).

torek 31.05.2019 00:25

Спасибо. Я получаю 2-ю строку. Мы создали новую ветку. О первой строке. 1) Для чего вносить информацию в FETCH_HEAD что будет, если этого не сделать? 2) «на удаленке» в какой части 1-й строки есть упоминание «удаленно»?

mfaani 31.05.2019 01:49

(1) Цель написания FETCH_HEAD двояка: (1a) Это то, что git fetch делал изначально, до того, как были изобретены имена для удаленного отслеживания. В древнем Git (до версии 1.5?) FETCH_HEAD это место Только для этих хэшей. Это старое поведение остается доступным и сегодня для тех, кто все еще зависит от него. (1b) Пока git pull не был переписан на C, сценарий git pull зависел от него. (2) Ничто в первой строке явно ничего не говорит об удаленном, но удаленный является другой репозиторий Git. Будучи репозиторием Git, он имеет ветки и теги. Ваш Git вызвал другой Git. [продолжение]

torek 31.05.2019 01:55

Другой Git перечислил для вашего Git его ветку, тег и другие ссылочные имена (и их хэш-идентификаторы). Ваш Git выбрал некоторые или все эти ссылки, чтобы скопировать их куда-нибудь в свой собственный Git (и в FETCH_HEAD). Итак, git fetch показывает вам имена, которые он видел в Git разное, например feature/8067. Это сокращает их, но, используя информацию слева, такую ​​как * branch, мы можем понять, от чего они были сокращены.

torek 31.05.2019 01:57

Чтобы увидеть, как это работает, запустите git ls-remote origin и посмотрите на результат. Это первые данные, которые git fetch получает.

torek 31.05.2019 01:57

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