Git fetch віддалене відділення


2260

Ми з колегою працюємо над тим самим сховищем. Ми розділили його на дві гілки, кожна технічно для різних проектів, але вони мають схожість, тому ми іноді захочемо повернутись до * masterвід branch.

Однак у мене є branch. Як мій колега може конкретно тягнути цю гілку?

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

Також, коли я спочатку робив філію, я і робив -b checkout. Чи це має велике значення?

$ git branch -r
origin/HEAD -> origin/master
origin/daves_branch
origin/discover
origin/master

$ git fetch origin discover
$ git checkout discover

Це команди, якими я керував. Але це точно не працює.

Я хочу мати змогу перевірити цю гілку, а потім натиснути і ввести назад лише зміни гілок у різних співробітників або робочих станцій .



33
Я використовував:, git fetch --allПотім, щоб переглянути всі гілки:, git branchПотім я перевіряю гілку:git checkout nameofnewbranch
Джефф Маттсон

перевірте своє запитання та /programming/1072261/push-and-pull-branches-in-git/47780374#47780374
Rizo


6
git fetch origin discover:discover && git checkout discover
Gayan Weerakutti

Відповіді:


3057

Потрібно створити локальну гілку, яка відстежує віддалену гілку. Наступна команда створить локальну гілку з назвою daves_branch , відстежуючи віддалене походження гілки / daves_branch . Після натискання змін віддалена гілка буде оновлена.

Для останніх версій Git:

git checkout --track origin/daves_branch

--trackце скорочення, git checkout -b [branch] [remotename]/[branch]де в даному випадку походить [remotename] і [гілка] вдвічі більше, в цьому випадку daves_branch .

Для Git 1.5.6.5 вам потрібно було це:

git checkout --track -b daves_branch origin/daves_branch

Для Git 1.7.2.3 і новіших версій цього достатньо (можливо, це почалося раніше, але це найдавніше підтвердження, яке я міг швидко знайти):

git checkout daves_branch

Зауважте, що в останніх версіях Git ця команда не створить локальну гілку і переведе вас у стан "відокремленої HEAD". Якщо ви хочете локальну філію, скористайтеся --trackопцією.

Повна інформація тут: 3.5 Git Branching - Віддалені гілки, Відстеження гілок


133
"git fetch", щоб переконатися, що ваше репо оновлено віддаленими посиланнями, а "git checkout - слід відстеження / виявлення" має бути достатньо. Тоді ви можете взяти на себе цю гілку і "git push", щоб синхронізувати пульт із змінами.
ralphtheninja

33
Я спробував це і отримав "fatal: git checkout: оновлення шляхів несумісне з перемиканням гілок. Ви мали намір перевірити" upstream / development ", який не може бути вирішено як фіксація?". Я щось роблю не так?
Ніл Барнвелл

42
Схоже, для цього потрібно git 1.5.6.5: git checkout --track -b origin / daves_branch
Charlie

35
Це створило для мене безлад, він створив місцеву гілку з назвою origin / <branch>, яка тепер неоднозначна з віддаленим походженням гілки / <branch>, і я не знаю, як позбутися шаленої місцевої гілки!
Алан Мур

24
Вам потрібно додати назву локальної гілки чітко, інакше git створює нову локальну гілку з повним шляхом до гілки, як заявили @AlanMoore та @ derekmx271 вище:git checkout -b --track daves_branch origin/daves_branch
Майк Скотт

961

Я використовував, fetchа потім checkout...

git fetch <remote> <rbranch>:<lbranch>
git checkout <lbranch>

... де <rbranch>знаходиться віддалений відділення або джерело, і <lbranch>це ще неіснуюча локальна філія або місце призначення, яку ви хочете відслідковувати, і яку ви, ймовірно, хочете назвати так само, як віддалену гілку або джерело. Це пояснюється під параметри в поясненні <refspec>.

Git настільки розумний, що автоматично виконує першу команду, якщо я вкладу після перших кількох літер віддаленої гілки. Тобто мені навіть не потрібно називати локальну гілку, Git автоматично копіює назву віддаленої гілки для мене. Дякую, Гіт!

Також як показано відповідь у подібній публікації про переповнення стека , якщо ви не назвали місцеву гілку fetch, ви все одно можете її створити, перевіривши її, використовуючи -bпрапор. Тобто, git fetch <remote> <branch> слідом за цим git checkout -b <branch> <remote>/<branch>робиться точно так само, як і моя початкова відповідь. І очевидно, якщо у вашому сховищі є лише один віддалений, то ви можете просто зробити це git checkout <branch>після, fetchі він створить локальну гілку для вас. Наприклад, ви просто клонували сховище і хочете перевірити додаткові гілки з віддаленого.

Я вважаю, що частина документації на, fetchможливо, була скопійована дослівно pull. Зокрема, розділ <refspec>у параметрах однаковий. Однак я не вірю, що fetchколи-небудь merge, так що якщо ви залишите сторону товстої кишки порожньою, fetch нічого не робити .

ПРИМІТКА: git fetch <remote> <refspec>короткий, git fetch <remote> <refspec>:який би нічого не робив, але git fetch <remote> <tag>є таким самим, git fetch <remote> <tag>:<tag>який слід копіювати на пульт <tag>локально.

Я думаю, це корисно лише в тому випадку, якщо ви хочете скопіювати віддалену гілку на місцевому рівні, але не обов'язково перевірити її відразу. В іншому випадку я б зараз використовував прийняту відповідь , яка детально пояснюється в першому розділі опису оформлення замовлення та пізніше в розділі варіантів під поясненням --track, оскільки це однолінійний. Ну ... начебто однолінійний, бо вам все одно доведеться бігти git fetch <remote>першим.

FYI: Порядок <refspecs>(джерело: призначення) пояснює химерний метод pre Git 1.7 для видалення віддалених гілок . Тобто нічого не підштовхуйте до місця призначення.


8
Ви припускаєте, що налаштування автодоповнення Git налаштоване. code-worrier.com/blog/autocomplete-git
antonagestam

2
Це працювало для мене, щоб отримати віддалений код у локальну гілку. Однак не вдалося моєму місцевому відділенню відстежити віддалене відділення.
Акноз

1
Чомусь git fetch remote branchвзагалі не додавали голову відділення для мене, хоча всі рефлекси отримані, тому коли я намагався виконувати кроки у прийнятій відповіді, я отримав помилку pathspec did not match any file(s) known to git., але rbranch:lbranchпідхід спрацював. Цікаво, що він також отримав усі теги, які почалися з того самого префікса, як це є майна ( rbranch*).
haridsv

3
Nit: git не робить автозавершення, це робить bash shell.
легалізувати

1
FWIW, я вважаю, що різниця між цією відповіддю та прийнятою відповіддю полягає в тому, що ця говорить вам виконати fetchкоманду. Це прийнята відповідь має сенс, хоча ОП зазначає, що він вже зробив це. Принаймні це питання, з яким я стикався.
tenor528

373

Якщо ви намагаєтесь "перевірити" нову віддалену гілку (яка існує лише на віддаленому, але не локально), ось що вам знадобиться:

git fetch origin
git checkout --track origin/<remote_branch_name>

Це передбачає, що ви хочете отримати з походження . Якщо ні, замініть походження на віддалене ім’я.


1
Працював для мене, я не знайшов правильної віддаленої гілки, тож прийнята відповідь не могла мені невдало заплутати повідомлення. +1
Натан Хінчі

Зазвичай я використовую git fetch, але річ у тому, чим відрізняється git fetch від git fetch origin?
Ping Woo

@PingWoo Припускаючи, що гілка, яку ви хочете отримати, знаходиться у віддаленому походження , і те git fetchй інше git fetch remoteзробить те саме. Якщо вам потрібно взяти з віддаленого, ніж іншого origin, ви можете це зробити, використовуючи git fetch <other_remote_name>. Ця ситуація є дуже рідкісною, щойно згадується тут для повноти.
paneer_tikka

1
Я майже бив головою об ПК, пробуючи всі ці рішення. Виявляється, у мене було ім'я друку в назві своєї гілки, нерозумно хе-хе.
Дев Єго

126

Щоб перевірити myBranch, який існує віддалено, а не локально - Це працювало для мене:

git fetch --all
git checkout myBranch

Я отримав це повідомлення:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'

1
Іншими словами, вам не потрібно писати -t?
Ендрю Самуельсен

4
Я думаю, що у цій відповіді є помилка. Я спочатку виконував команду без -tі отримав, You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.тому що там не було однойменної місцевої гілки. Мені довелося повторно бігти, -tщоб виправити
станрі

1
Це добре працювало для мене - мій колега додав нову віддалену гілку, яку я хотів додати до свого місцевого репо. Я продовжував отримувати, але не бачив, що нова гілка з’являється локально. Не зрозумів, що я можу просто запустити checkoutйого, щоб створити його. Дякую!
skwidbreth

2
залежить від git версій. Остання версія, як тут сказано в іншому місці, потребує лише перевірки на git <назва відділення за походженням>.
Будьте уважні з місцевою локальною командою

--allніколи не є хорошою ідеєю, тому що вона завантажить кожен файл у кожній гілці. Це займе більше часу та місця. Це краще бути конкретним з ім'ям гілки і зробити , як це
Honey

53

Використовуйте git branch -a(як локальну, так і віддалену гілки) або git branch -r(лише віддалені гілки), щоб переглянути всі віддалені та їх гілки. Потім ви можете зробити a git checkout -t remotes/repo/branchдо віддаленого і створити локальну гілку.

Існує також команда git-ls-remote, щоб побачити всі посилання та теги цього віддаленого пристрою.


git checkout remotes/repo/branchзмушує git checkout шукати шлях, а не віддалений репо.
Ерін

1
Так, чи можливо навіть оформити відділення на віддаленому репо? Очевидно (або, можливо, це було не так очевидно), пульти спочатку отримують, щоб мати їх локально. У книзі git є хороший розділ про них: git-scm.com/book/en/Git-Branching-Remote-Branches
Daniel Lee

43

Назва та питання плутаються:

  • Git fetch віддалене відділення
  • як мій колега конкретно може тягнути цю гілку.

Якщо питання полягає в тому, як я можу змусити працювати віддаленим відділенням, або як я можу отримати Git, щоб отримати віддалений відділення? , більш просте рішення:

З Git (> = 1.6.6) ви можете використовувати:

git checkout <branch_name>

Якщо локального <branch_name>не знайдено, але існує гілка відстеження точно в одному пульті з відповідним іменем, розглядайте це як рівнозначне:

git checkout -b <branch_name> --track <remote>/<branch_name>

Дивіться документацію для оформлення замовлення на Git

Для вашого друга:

$ git checkout discover
Branch discover set up to track remote branch discover
Switched to a new branch 'discover'

Дякую Гійом! Я просто використав цю команду і написав повідомлення про неї, щоб зобразити мій точний випадок: leniel.net/2014/05/…
Леніел Маккаферрі

<! - git checkout <remote-branch-name> -> працює як слід, Дякую Гійом!
Sachidananda Naik

36

Найпростіший спосіб зробити це, принаймні для мене:

git fetch origin <branchName> # Will fetch the branch locally
git checkout <branchName> # To move to that branch

1
Не приносить інших гілок
Бенджамін Харел

7
@BenjaminHarel у запитанні йдеться про "отримання віддаленої гілки" не для всіх гілок. для цього дотримуватися цього може бути корисним для вас stackoverflow.com/questions/10312521 / ...
Джеймс Rochabrun

2
Після використання цієї fetchкоманди потрібна гілка буде доступна на локальній машині. git checkout -b 'your_branch' origin/'remote branch'Потрібно оформити цю гілку.
Абхієет

30

Використання:

git checkout -b serverfix origin/serverfix

Це достатньо поширена операція, за допомогою якої Git забезпечує --trackскорочення:

git checkout --track origin/serverfix

Насправді це настільки часто, що для цього ярлика є навіть ярлик. Якщо назва гілки, яку ви намагаєтеся отримати (a), не існує, і (b) точно відповідає імені лише на одному віддаленому пристрої, Git створить для вас гілку відстеження:

git checkout serverfix

Щоб налаштувати локальну гілку з іншою назвою, ніж віддалена гілка, ви можете легко використовувати першу версію з іншою назвою місцевої гілки:

git checkout -b sf origin/serverfix

Тепер ваше місцеве відділення sfавтоматично з’явиться origin/serverfix.

Джерело: Pro Git, 2-е видання , написане Скоттом Чейконом та Бену Штраубом (вирізане для читабельності)


Ці скорочення були уроком
З. Хулла


18

Для отримання гілки, яка існує на віддаленому, найпростіший спосіб:

git fetch origin branchName
git checkout branchName

Ви можете побачити, чи він уже існує на віддаленому пристрої за допомогою:

git branch -r

Це призведе до віддаленого відділення до вашого локального і автоматично відстежить віддалене.


2
Як це питання не має більшої кількості результатів? Я можу помилятися, але це впевнене, здавалося, зробило трюк, дістало гілку, яку я не мав на місцевих з віддаленого ...
Ніколас Петерсен

15

Що мені допомогло

1) Перегляд усіх доступних віддалених гілок (наприклад, "ім'я віддаленої гілки")

git branch -r

2) Створіть локальну гілку, використовуючи віддалену назву гілки

git fetch && git checkout 'remote-branch-name'

1
Що відбувається при запуску команди git pushбез будь-яких інших аргументів? Чи remote-branch-nameавтоматично названа локальна гілка пов'язана з (відстеженням) віддаленою гілкою origin/remote-branch-name. Або вам потрібно бігтиgit push -u origin remote-branch-name
PatS

1
це призведе до відстороненого стану HEAD
Akin Hwan



13

Я набрав

git checkout <branch_name>

і отримав

Branch <branch_name> set up to track remote branch <branch_name> from origin.
Switched to a new branch '<branch_name>'

з документації з оформлення перевірки git: Якщо <branch_name> не знайдено, але існує гілка відстеження точно в одному віддаленому пристрої із відповідним ім'ям, розглядайте як еквівалент:git checkout -b <branch_name> --track <remote>/<branch_name>
Гійом Вінсент,

11

Часом вас просять не спілкуватися з головним відділенням і працювати тільки з віддаленою гілкою (як мене просили). Отже, все, що вам потрібно, - це віддалене відділення.

Отже, щоб клонувати віддалену гілку самостійно (без майстра), зробіть це

git clone url --branch remote_branch_name

де, remote_branch_name - назва віддаленої гілки

Наприклад,

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --branch v3.15

Це забезпечить клонування віддаленої гілки до вашої місцевої гілки з назвою віддаленої гілки.

Тепер, якщо ви введете свій код і натисніть, код буде надісланий до цієї гілки самостійно.


Пов’язано: Як мені клонувати одну гілку в Git? - "git 1.7.10 (квітень 2012) фактично дозволяє клонувати лише одну гілку:"
Peter Mortensen

11

[Швидкий відповідь]

Є багато альтернатив, і мої улюблені:

- Альтернатива 1:

git fetch --all
git checkout YourBranch

Використовуючи цю альтернативу, використовуючи гілки, які існують віддалено, але не у вашому регіоні.

- Альтернатива 2:

git checkout -b 'YourBranch' origin/'YourRemote'

Напевно, це найпростіший спосіб.


9

Скажімо, що ваш пульт - git@xyz.git, і ви хочете його відділення random_branch. Процес повинен бути таким:

  1. Спочатку перевірте список віддалених користувачів на

    git remote -v

  2. Якщо у висновку вищезгаданої команди у вас немає дистанційного git@xyz.git, ви додасте його до

    git remote add xyz git@xyz.git

  3. Тепер ви можете отримати вміст цього віддаленого пристрою

    git fetch xyz

  4. Тепер огляньте відділення цього віддаленого від

    git checkout -b my_copy_random_branch xyz/random_branch

  5. Перевірте список відділень за адресою

    git branch -a

Місцева гілка my_copy_random_branch буде відслідковувати гілку random_branch вашого пульта.




7

Я хочу дати вам однолінійну команду для отримання всіх віддалених гілок до вашого локального та переключення на бажану новостворену локальну гілку:

git fetch && git checkout discover

Після виконання вищевказаної команди ви отримаєте повідомлення нижче:

Switched to a new branch 'discover'
Branch discover set up to track remote branch discover from origin.

У першому рядку зазначено, що перейшли на нову гілку - чому нову? Це вже там, у віддаленому!

Але насправді вам доведеться створити і локально. Гілка взята з віддаленого індексу та створена локально для вас.

Ось discoverнова гілка, створена з віддаленого відділення вашого сховища discover.

Але другий рядок дає більше інформації, ніж перший, який говорить нам, що:

Наша філія створена для відстеження однойменної віддаленої гілки .

Хоча git fetch отримує всі гілки до місцевих. Але якщо ви будете бігати git branchза ним, ви побачите лише masterгілку на місцевому рівні. Чому ?

Тому що для кожної гілки, яку ви маєте у віддаленому режимі, вам також потрібно створити її локально, щоб відстежувати її так, git checkout <branchname>як ми це робили у наведеному вище прикладі.

Після запуску git checkoutкоманди можна запустити git branch, і тепер ви можете побачити обидві гілки:

  1. майстер та 2. відкрийте для себе місцевий список.


5

Просто спробуйте:

git pull origin your_branch_name

2
Rizo, git pull origin_name_re_name мають стати найкращим рішенням. Ви єдина людина, яка розмістила це як рішення, і це працювало на мене. Це працює, тому що оновить вашу гілку з основною гілкою. простий і нехитрий.
Ian Poston Framer

3
проблема з цим полягає в тому, що вона спробує об'єднати цю віддалену гілку з вашою поточною гілкою, яка не є віддаленою (оскільки це нове для вашої місцевої репо)
Z. Khullah

Це приєднається до вашої поточної галузі.
Eem Jee

4

Якщо у вас є сховище, яке було клоновано, --depth 1тоді багато перерахованих команд не працюватимуть. Наприклад, дивіться тут

% git clone --depth 1 https://github.com/repo/code
Cloning into 'code'...
cd code
remote: Counting objects: 1778, done.
remote: Compressing objects: 100% (1105/1105), done.
remote: Total 1778 (delta 87), reused 1390 (delta 58), pack-reused 0
Receiving objects: 100% (1778/1778), 5.54 MiB | 4.33 MiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Checking out files: 100% (1215/1215), done.
% cd code
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
% git fetch origin other_branch
remote: Counting objects: 47289, done.
remote: Compressing objects: 100% (15906/15906), done.
remote: Total 47289 (delta 30151), reused 46699 (delta 29570), pack-reused 0
Receiving objects: 100% (47289/47289), 31.03 MiB | 5.70 MiB/s, done.
Resolving deltas: 100% (30151/30151), completed with 362 local objects.
From https://github.com/repo/code
 * branch            other_branch-> FETCH_HEAD
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
%

У цьому випадку я б повторно сховив сховище, але, можливо, є й інші методи, наприклад, git дрібний клон (clone --depth) не вистачає віддалених гілок


3

Якщо ви вже знаєте свою віддалену галузь так ...

git remote
=> One
=> Two

і ви знаєте назву філії ви хочете перевірки, наприклад, br1.2.3.4 , то зробити

git fetch One
=> returns all meta data of remote, that is, the branch name in question.

Залишилося лише оформити відділення

git checkout br.1.2.3.4

Потім зробіть з нього будь-які нові гілки.


3

Кроки такі:

  1. git fetch originабо git fetch --all, це отримає всі віддалені гілки до вашого локального, і тоді це другий варіант, з яким ви можете продовжити.

  2. git checkout --track origin/<The_remote_branch you want to switch over>

Потім працюйте над цією гілкою, і ви можете перевірити, перебуваєте ви на цій гілці чи ні, ввівши її

git branch

Він відображає галузь, в якій ви зараз перебуваєте.



2

Перевірте свій .git/configфайл, особливо те, що відстеження присутнє у вилученні цього віддаленого пристрою.

[remote "randomRemote"]
    url = git@github.com:someUser/someRepo.git
    fetch = +refs/heads/*:refs/remotes/randomRemote/*

Якщо він heads/*вказує randomRemote/*, коли ви запустите git fetch randomRemote, він отримає всі гілки.

Тоді ви можете просто перевірити цю гілку.

Інакше

  1. Для цього слід додати віддалені гілки до відстеження. Перевірте свою, .git/configпісля запуску цього. Ви зрозумієте.

    git remote set-branches --add randomRemote randomBranch
    
  2. Біжи git fetch randomRemote. Це отримає віддалену гілку.

  3. Тепер ви можете бігти git checkout randomBranch.


1

Ви використовуєте "git pull", щоб відділити свої гілки. Я буду використовувати фактичні назви сховища та гілок, щоб допомогти, оскільки 'lbranch' і 'rbranch' важко розшифрувати.

Давайте скористаємося:

  • myteam.unfuddle.com = віддалений сервер Git
  • tlc = Скасувати обліковий запис проекту, де існує сховище
  • daves_branch = назва віддаленої гілки

    Ви або будь-який колега можете запустити це, щоб витягнути лише свою гілку, незалежно від кількості гілок.

    git init
    git pull git@myteam.unfuddle.com:myteam/tlc daves_branch:refs/remotes/origin/daves_branch
    

  • 0

    Проста команда git checkout remote_branch_nameдопоможе вам створити локальну гілку, яка має всі зміни у віддаленій гілці.


    -2
    git checkout -b branch_name
    git pull remote_name branch_name
    

    3
    Хоча цей фрагмент може відповісти на питання, краще включити пояснення щодо того, що він робить, і чим він відрізняється від дуже великої кількості відповідей, які вже є тут.
    DaveyDaveDave

    2
    Мені особисто такий варіант не подобається. Тому що, якщо ви створюєте нову гілку з програми Master і потім витягуєте дані з віддаленої гілки, ця віддалена гілка може бути, а може бути, не на тій же сторінці, що і майстер, і може запросити деякі непотрібні оновлення коду
    zeetit

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