Хороший и простой вопрос - является ли функция git fetch строгим подмножеством git fetch --tags
?
Т.е., если я бегу git fetch --tags
, есть ли причина немедленно бежать git fetch
прямо после этого?
Что о git pull
и git pull --tags
? Такая же ситуация?
Ответы:
Примечание: начиная с git 1.9 / 2.0 (первый квартал 2014 года) ,
git fetch --tags
извлекает теги в дополнение к тем, которые выбираются той же командной строкой без опции.См совершить c5a84e9 по Michael Хаггерти (mhagger) :
Поскольку Git 2.5 (2-й квартал 2015 года)
git pull --tags
является более надежным:См. Коммит 19d122b от Paul Tan (
pyokagan
) , 13 мая 2015 г.(объединено с Junio C Hamano
gitster
- в коммите cc77b99 , 22 мая 2015 г.)С Git 2.11+ (4 квартал 2016 г.)
git fetch
быстрее.См. Коммит 5827a03 (13 октября 2016 г.) Джеффа Кинга (
peff
) .(Слиты Junio C Hamano -
gitster
- в фиксации 9fcd144 , 26 окт 2016)Это относится только к ситуации, когда:
Git 2.21 (февраль 2019), кажется, ввел регрессию, когда конфигурация не
remote.origin.fetch
является конфигурацией по умолчанию ('+refs/heads/*:refs/remotes/origin/*'
)Git 2.24 (Q4 2019) добавляет еще одну оптимизацию.
См. Коммит b7e2d8b (15 сентября 2019 г.) от Masaya Suzuki (
draftcode
) .(Слиты Junio C Hamano -
gitster
- в фиксации 1d8b0df , 7 октября 2019)источник
git fetch <remote> <branch>
тегов с автоматическим следованием (поскольку оно уже обновляет удаленные отслеживания ПРОТИВ первоначальных намерений): public-inbox.org/git/…Примечание: этот ответ действителен только для git v1.8 и старше.
Большая часть этого была сказана в других ответах и комментариях, но вот краткое объяснение:
git fetch
извлекает все заголовки веток (или все указанные в параметре конфигурации remote.fetch), все необходимые коммиты и все теги, которые доступны из этих веток. В большинстве случаев все теги достижимы таким образом.git fetch --tags
извлекает все теги, все необходимые для них коммиты. Он не будет обновлять заголовки веток, даже если они достижимы из выбранных тегов.Резюме: Если вы действительно хотите быть полностью в курсе, используя только выборку, вы должны сделать оба.
Это также не «вдвое медленнее», если только вы не имеете в виду ввод в командной строке, в этом случае псевдонимы решают вашу проблему. По сути, нет никаких накладных расходов при выполнении двух запросов, поскольку они запрашивают разную информацию.
источник
git remote update
самом деле не является заменойgit fetch
иgit fetch --tags
.git remote update
не будет обновлять существующие теги, которые были изменены, хотя это принесет новые теги. Толькоgit fetch --tags
обновит уже существующие теги.Я собираюсь ответить на это сам.
Я определил, что есть разница. "git fetch --tags" может содержать все теги, но не вводить новые коммиты!
Оказывается, нужно сделать это, чтобы быть полностью «актуальным», то есть реплицировать «git pull» без слияния:
Это позор, потому что это в два раза медленнее. Если бы только у «git fetch» была возможность сделать то, что он обычно делает, и ввести все теги.
источник
git remote update myRemoteRepo
': это будет извлекать удаленный контент и теги?git fetch
все время, и это последовательно сбрасывает любые новые коммиты и любые новые теги. Какую версию Git вы используете?git fetch
не будет захватывать теги, которых нет в журнале фиксации ветви. Пользовательский интерфейс jQuery делает это, например, в теге выпуска. Мы делаемgit checkout -b temp-branch
, делаем наш выпуск, добавляем файлы, необходимые для выпуска, обновляем версию и т. Д., А затемgit commit -m "1.10.x" ; git tag 1.10.x; git push --tags
удаляем нашу локальную временную ветку. Не существует удаленной ветви, которая достигает этого тега иgit fetch
никогда не загрузит его.Общая проблема здесь заключается в том, что
git fetch
будет доставать+refs/heads/*:refs/remotes/$remote/*
. Если какой-либо из этих коммитов имеет теги, эти теги также будут выбраны. Однако, если есть теги, недоступные для какой-либо ветви на удаленном компьютере, они не будут выбраны.--tags
Опция переключает refspec в+refs/tags/*:refs/tags/*
. Вы могли бы спроситьgit fetch
захватить оба. Я уверен, что просто сделаю,git fetch && git fetch -t
вы бы использовали следующую команду:И если вы хотите сделать это по умолчанию для этого репо, вы можете добавить второй refspec к выборке по умолчанию:
Это добавит секунду
fetch =
строку.git/config
для этого пульта.Я потратил некоторое время на поиски способа справиться с этим для проекта. Это то, что я придумал.
В моем случае я хотел эти функции
refs/*:refs/*
+
перед ссылкой-u
-p
-f
источник
--tags
Опция переключает ссылку на+refs/tags/*:refs/tags/*
». Хотя,man git-fetch
кажется, указывает, что refspec без ведущего+
(refs/tags/*:refs/tags/*
).remote.origin.fetch
по умолчанию+refs/heads/*:refs/remotes/origin/*
, т.е.+
версия, не так ли? (Это означает, что происхождение / ветвь будут перезаписаны, независимо от того, где происхождение / ветвь находятся сейчас локально.)git --tags
извлекали теги в дополнение ко всему остальному. Смотрите ответ @VonC.В большинстве случаев
git fetch
следует делать то, что вы хотите, а именно: «получить что-то новое из удаленного хранилища и поместить его в локальную копию, не сливая с локальными филиалами».git fetch --tags
делает именно это, за исключением того, что он не получает ничего, кроме новых тегов.В этом смысле
git fetch --tags
никоим образом не является надмножествомgit fetch
. На самом деле все с точностью до наоборот.git pull
Конечно, это всего лишь обертка дляgit fetch <thisrefspec>; git merge
. Рекомендуется привыкнуть к ручномуgit fetch
вводу иgit merge
выводу до того, как вы совершите переход,git pull
просто потому, что это поможет вам понять, чтоgit pull
в первую очередь происходит.При этом отношения точно такие же, как и с
git fetch
.git pull
это надмножествоgit pull --tags
.источник
git pull
он не получает все теги, а только те, которые доступны из текущих глав филиалов. Однакоgit pull --tags
извлекает все теги и, по-видимому, эквивалентноgit fetch --tags
.работает просто отлично, он получит только новые теги и не получит никакой другой базы кода.
источник
upstream
обычно называетсяorigin
. Я думаю, чтоupstream
это имя используется GitHub. В любом случае, используемое имя - это то, что показаноgit remote
.