Як ви можете git тягнути лише поточну гілку?


81

Чи існує конфігураційний спосіб встановити це без необхідності вказувати, яка гілка?

Відповіді:


84

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}
}

це правильно, і, можливо, трохи дивно, оскільки "git push" (за замовчуванням) намагається висунути всі гілки (з однаковим іменем віддаленого).
Алессандро Де Сімоне

2
@AlessandroDs Ну, я встановив push.default вгору за течією саме з цієї причини. Нове значення за замовчуванням для push.default є "простим", яке знову лише оновлює поточну гілку, тому набагато паралельніше тому, що робить pull.
Сет Робертсон,

1
@Danjah: Усі зміни витягуються з віддаленого репо (у віддалені гілки відстеження, наприклад origin / master origin / foo тощо). Якщо ви зареєструвались у локальній гілці із визначеним вище, вона буде оновлена. Якщо ви зареєструвались у локальній гілці без вищого потоку, тоді ви повинні вказати більше інформації або встановити висхідний. Не намагайтесь модифікувати нелокальне оформлення замовлення, створіть локальне відділення та продовжуйте. Якщо ви хочете зменшити кількість переданих даних, ви можете оновити refspec вашого пульта в локальній конфігурації git.
Сет Робертсон,

1
Чи є вбудований спосіб не оновлювати всі посилання лише для отримання поточної гілки?
Aditya MP

1
@aditya menon: Непросто. Вам потрібно буде оновити refspec (наприклад, git config remote.origin.fetch), щоб отримати лише ті конкретні посилання (гілки, теги тощо), які ви хочете. Дивіться stackoverflow.com/questions/15507264/… для отримання більш конкретних прикладів.
Сет Робертсон,

61

Я просто зробив це так:

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

або

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

Це витягує поточну git branchгілку з віддаленого джерела та витягує цю гілку.

Зверніть увагу, що, як сказав Сет Робертсон, коли не наводяться аргументи, змінюється лише поточна гілка, але всі віддалені гілки отримуються. Я не хочу отримувати всі віддалені гілки, тому я зробив це таким чином.


3
git branchнасправді не слід аналізувати інформацію про філії. Ця інформація доступна після git rev-parseвведення команди:git pull origin $(git rev-parse --abbrev-ref HEAD)
Paul DelRe

@ayke Я додав відповідь Пола Дельре у вашу, оскільки вона також спрацювала, сподіваюся, ви обидва не проти
Тимо Хуовінен

1
Просто цікаво: Яка різниця між простим "git pull" (перевіривши гілку, яку я хочу витягнути) і вашою пропозицією? Результат підстановки вашої команди, git pull origin <current-branch>який у будь-якому випадку є типовим, правда? Ви маєте на увазі, що інші віддалені гілки (наприклад, джерело / інша гілка тощо) не оновлюються, щоб зменшити трафік?
Пітер - Відновити Моніку

Я відповів на це століття тому, я вже насправді не знаю. Ви, мабуть, повинні піти з прийнятою відповіддю ...
ayke

@ 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. Мені б дуже хотілося знати, як склалася така ситуація, коли немає інформації про відстеження.
Alfe,

18

ОНОВЛЕННЯ

Стара відповідь, яку я додав, більше не працює: /. Але після того, як я отримав кілька голосів щодо версії PUSH, яку я розмістив, для мене означає, що ця відповідь насправді допомагає комусь, що закінчення приходить сюди з пошукових систем, тому я збережу цю відповідь.

Спробуйте це для нової версії git:

$ git config --global push.default current

9
Я не вірю, що pull.default існує. Див. Git-scm або kernel.org .
Морт

2
Так. git 2.3.4 на linux витягує всі гілки, навіть із зазначеними вище pull.default=current. Я бачу, що мій git cloneза замовчуванням також додано, remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*але це досить стандартно.
Морт

6
Немає pull.defaultзмінної конфігурації. Помістивши це у конфігурації git, ви нічого не зробите.
Девід Сандерс,

5
Питання стосується git pull, а відповідь містить git push з великою кількістю голосів. Це вводить в оману @BrunoCasali Чому ви редагували свою відповідь і видаляли її, якщо вона вам працювала? Якщо ви зрозуміли, що відповідь неправильна, будь ласка, видаліть її, замість того, щоб зберігати недоречну інформацію, щоб зберегти голоси за.
TJ

5

Так, існує конфігурація, яку можна змінити .gitconfig, наприклад:

[push]
  default = current

що підштовхне поточну гілку до оновлення гілки з тим самим іменем на приймальному кінці.

Перевірити:

git config --global --get push.default

Дивіться: git-config .


3

--set-upstreamПрапор є застарілим і буде видалений. Отже, використовуйте --trackабо--set-upstream-to

Приклад: Якщо ви хочете встановити інформацію про відстеження для цієї гілки, ви можете зробити це за допомогою:

git branch --set-upstream-to=<remote>/<branch> develop

Він може бути застарілим (джерело?), Але --set-upstream-to=постійно згадується git, коли він не знає про вашу інформацію про відстеження. Без згадки про знецінення.
Адріен

@AdrienGiboire Ось трохи інформації про припинення існування
biniam,

0

Ось псевдонім 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"

(Застереження: я дуже новачок, і вищесказане, можливо, можна було б значно спростити.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.