Как вы можете git вытащить только текущую ветку?

Есть ли способ настроить это без указания ветки?


person qodeninja    schedule 18.05.2011    source источник


Ответы (6)


Git уже тянет только текущую ветку. Если у вас есть ветвь, настроенная как отслеживающая ветвь, вам не нужно указывать удаленную ветвь. git branch --set-upstream localbranch reponame/remotebranch установит отношения отслеживания. Затем вы выпускаете git pull [--rebase], и только эта ветвь будет обновлена.

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

Полезный псевдоним Bash для сокращения ввода этой общей операции:

# Add an alias to pulling latest git changes into your same branch
alias pullhead='git pull origin $(git rev-parse --abbrev-ref HEAD)'

Функция Powershell, которая делает то же самое:

Function pullhead {
    $cur_head="$(git rev-parse --abbrev-ref HEAD)"
    & git pull origin ${cur_head}
}
person Seth Robertson    schedule 18.05.2011
comment
это правильно, и, возможно, немного странно, потому что git push (по умолчанию) пытается отправить все ветки (с тем же удаленным именем). - person Alessandro De Simone; 03.09.2013
comment
@AlessandroDs Ну, именно по этой причине я установил для push.default значение upstream. Новое значение по умолчанию для push.default простое, которое снова обновляет только текущую ветку, поэтому оно гораздо более параллельно тому, что делает pull. - person Seth Robertson; 04.09.2013
comment
@SethRobertson: Спасибо за ответ, можете ли вы вообще рассказать об этой последней части? Под измененными вы подразумеваете, что изменения не извлекаются из удаленного репо? Мы обнаружили, что с несколькими ветками по ~ 100 МБ каждая, когда мы делаем извлечение, мы получаем несколько загрузок ~ 100 МБ (в основном все ветки). - person danjah; 10.10.2014
comment
@Danjah: все изменения извлекаются из удаленного репо (в ветки удаленного отслеживания, например, origin/master origin/foo и т. д.). Если вы разрегистрируетесь в локальной ветке с определенным восходящим потоком, будет обновлена ​​только эта локальная ветка. Если вы разрегистрированы в локальную ветвь без восходящего потока, то вы должны указать дополнительную информацию или установить восходящий поток. Не пытайтесь изменить нелокальную кассу, создайте локальную ветвь и продолжайте. Если вы хотите уменьшить то, что вы передаете, вы можете обновить refspec вашего пульта в вашей локальной конфигурации git. - person Seth Robertson; 10.10.2014
comment
Есть ли встроенный способ не обновлять все ссылки, а получать только текущую ветку? - person Aditya M P; 20.02.2015
comment
@aditya menon: Не так просто. Вам нужно будет обновить refspec (например, git config remote.origin.fetch), чтобы получать только те ссылки (ветви, теги и т. д.), которые вам нужны. См. stackoverflow.com/questions/15507264/ для более конкретных примеров. - person Seth Robertson; 20.02.2015
comment
почему тогда на этой странице: git-scm.com/book/ en/v2/Git-Internals-The-Refspec указывает, что в случае по умолчанию он тянет все ветки, и если вам нужно тянуть только master, вам нужно указать это в refspecs.. ? - person Matt; 07.01.2019
comment
@Matt: Различные варианты использования слова «тянуть». Я сказал, что Конечно, все ветки удаленного отслеживания и все рефы для удаленного будут обновлены. Если вы хотите обновить только основную ветку удаленного отслеживания, вам придется изменить refspec. Тем не менее, я использовал pull в смысле git pull обновления чего-то, что вы обычно проверяете, и, используя это определение, вытягивается только одна ветвь. - person Seth Robertson; 08.01.2019

Я просто сделал это так:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

or

git pull origin $(git rev-parse --abbrev-ref HEAD)

Это извлекает текущую ветку из git branch и извлекает эту ветку из удаленного источника.

Обратите внимание, что, как сказал Сет Робертсон, когда аргументы не указаны, изменяется только текущая ветка, но извлекаются все удаленные ветки. Я не хочу получать все удаленные ветки, поэтому я сделал это так.

person ayke    schedule 27.04.2014
comment
git branch на самом деле не следует анализировать информацию о ветке. Эта информация доступна, если git rev-parse выполнить команду: git pull origin $(git rev-parse --abbrev-ref HEAD) - person Paul DelRe; 09.08.2016
comment
@ayke Я добавил ответ Пола ДельРе в ваш, так как он тоже сработал, надеюсь, вы оба не возражаете - person Timo Huovinen; 11.11.2016
comment
Просто любопытно: в чем разница между простым git pull (проверив ветку, которую я хочу вытащить) и вашим предложением? Ваша подстановка команды приводит к git pull origin <current-branch>, которая в любом случае является значением по умолчанию, не так ли? Вы подразумеваете, что другие удаленные ветки (например, origin/other-branch и т. д.) не обновляются, чтобы уменьшить трафик? - person Peter - Reinstate Monica; 19.09.2017
comment
Я ответил на это много лет назад, я действительно больше не знаю. Вы, вероятно, должны пойти с принятым ответом... - person ayke; 29.09.2017
comment
@PeterA.Schneider Если вы просто наберете git pull, вы можете получить сообщение вроде There is no tracking information for the current branch. Please specify which branch you want to merge with.. Тогда вы всегда набираете git pull origin my-feature-branch. Я действительно хотел бы знать, как возникает эта ситуация, когда нет информации об отслеживании. - person Alfe; 16.07.2018
comment
git pull origin $(git branch --show-current), который легче запомнить. - person RN Kushwaha; 18.08.2020

ОБНОВЛЕНИЕ

Старый ответ, который я добавил, больше не работает :/. Но после того, как я получил несколько положительных отзывов о версии PUSH, которую я разместил, для меня это означает, что этот ответ на самом деле помогает кому-то, кто пришел сюда из поисковых систем, поэтому я сохраню этот ответ.

Попробуйте это для новой версии git:

$ git config --global push.default current
person Bruno Casali    schedule 09.02.2015
comment
Я не верю, что pull.default существует. См. git-scm или kernel.org . - person Mort; 16.06.2015
comment
да. git 2.3.4 в Linux извлекает все ветки даже с указанным выше pull.default=current. Я вижу, что мой git clone по умолчанию также добавил remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*, но это довольно стандартно. - person Mort; 18.06.2015
comment
Нет переменной конфигурации pull.default. Помещение этого в вашу конфигурацию git ничего не даст. - person David Sanders; 20.11.2015
comment
Вопрос о git pull, а ответ содержит git push с большим количеством голосов. Это вводит в заблуждение @BrunoCasali Почему вы отредактировали свой ответ и удалили его, если он сработал для вас? Если вы понимаете, что ответ неверен, пожалуйста, удалите его, а не сохраняйте с неактуальной информацией, чтобы сохранить голоса. - person T J; 19.07.2017

Флаг --set-upstream устарел и будет удален. Следовательно, используйте --track или --set-upstream-to

Пример: если вы хотите установить информацию об отслеживании для этой ветки, вы можете сделать это с помощью:

git branch --set-upstream-to=<remote>/<branch> develop
person biniam    schedule 10.07.2015
comment
Это может быть устаревшим (источник?), но --set-upstream-to= продолжает упоминаться git, когда он не знает о вашей информации об отслеживании. Без упоминания об устаревании. - person Adrien; 03.04.2017
comment
@AdrienGiboire Вот некоторая информация об устаревании: jira.atlassian.com/browse/SRCTREEWIN-588< /а> - person biniam; 05.04.2017

Да, есть конфиг, который можно изменить в .gitconfig, например:

[push]
  default = current

который подтолкнет текущую ветку к обновлению ветки с тем же именем на принимающей стороне.

Проверить по:

git config --global --get push.default

См.: git-config.

person kenorb    schedule 24.10.2015
comment
Вопрос касался git pull, а не git push, поэтому я понизил ваш ответ, чтобы люди не думали, что это решение. - person Manse; 04.02.2021

Вот псевдоним git, который не предполагает, что удаленным является origin, и обрабатывает, если ветка не отслеживает удаленный.

pullh = "!f() { set -e; set -o pipefail; arr=($(git rev-parse --abbrev-ref @{u} | sed 's/\\//\\n/')); git pull ${arr[0]} ${arr[1]}; }; f"

(Отказ от ответственности: я очень новичок в bash, и вышеизложенное, вероятно, можно было бы сильно упростить.)

person scobi    schedule 20.08.2020