Git получить удаленную ветку


2261

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

Тем не менее, у меня есть branch. Как мой коллега может специально использовать эту ветку?

git cloneХранилища , кажется, не создавать филиалы на местах для него, хотя я могу видеть , что они живут на unfuddle после толчка на моем конце.

Кроме того, когда я изначально сделал ветку, я сделал -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
Джефф Маттсон



6
git fetch origin discover:discover && git checkout discover
Гаян Виракутти

Ответы:


3062

Вам нужно создать локальную ветку, которая отслеживает удаленную ветку. Следующая команда создаст локальную ветвь с именем daves_branch , отслеживая происхождение удаленной ветки / daves_branch . Когда вы нажмете свои изменения, удаленная ветвь будет обновлена.

Для самых последних версий Git:

git checkout --track origin/daves_branch

--trackэто сокращение от того, git checkout -b [branch] [remotename]/[branch]где [remotename] является источником в этом случае, а [branch] в два раза больше, в этом случае 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 - Удаленные ветки, отслеживание веток


134
«git fetch», чтобы убедиться, что ваше хранилище обновлено удаленными ссылками, и «git checkout --track origin / Discover» должно быть достаточно. Затем вы можете зафиксировать эту ветку и выполнить «git push» для синхронизации пульта с вашими изменениями.
ralphtheninja

33
Я попробовал это и получил «fatal: git checkout: обновление путей несовместимо с переключением веток. Вы намеревались извлечь 'upstream / development', который не может быть разрешен как коммит?". Я делаю что-то неправильно?
Нил Барнвелл

42
Похоже, git 1.5.6.5 нуждается в этом: git checkout --track -b origin / daves_branch
Чарли

35
Это сделало для меня беспорядок, он создал локальную ветку с именем origin / <branch>, которая теперь неоднозначна с удаленной веткой origin / <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 автоматически копирует для меня имя удаленной ветви. Спасибо 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>первым.

К сведению: порядок <refspecs>(источник: место назначения) объясняет причудливый метод pre Git 1.7 для удаления удаленных веток . То есть ничего не вставляйте в пункт назначения refspec.


8
Вы предполагаете, что автозаполнение Git настроено. code-worrier.com/blog/autocomplete-git
антагонестам

2
Это сработало для меня, чтобы получить удаленный код в локальную ветку. Однако мой локальный филиал не смог отследить удаленный филиал.
Акносис

1
По какой-то причине я git fetch remote branchвообще не добавил заголовок ветки, хотя все ссылки были получены, поэтому, когда я попытался выполнить шаги в принятом ответе, я получил ошибку pathspec did not match any file(s) known to git., но rbranch:lbranchподход сработал. Интересно, что он также выбрал все теги, которые начинались с того же префикса, как будто это подстановочный знак ( rbranch*).
haridsv

3
Nit: git не выполняет автозаполнение, это делает оболочка bash.
узаконить

1
FWIW, я думаю, что разница между этим ответом и принятым ответом заключается в том, что этот говорит вам выполнить fetchкоманду. Если принятый ответ имеет смысл, потому что OP отмечает, что он уже сделал выборку. По крайней мере, это проблема, с которой я столкнулся.
tenor528

373

Если вы пытаетесь «оформить» новую удаленную ветку (которая существует только на удаленной, но не локально), вот что вам нужно:

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

Это предполагает, что вы хотите получить из источника . Если нет, замените источник на ваше удаленное имя.


1
Работая на меня, я не выбрал правильную удаленную ветку, поэтому принятый ответ не давал мне сбивающего с толку сообщения. +1
Натан

Обычно я использую git fetch, но в чем разница между git fetch и git fetch?
Пинг Ву

@PingWoo Предполагая , что ветвь вы хотите извлечь находится в происхождении удаленных, так git fetchи git fetch remoteбудет делать то же самое. Если вам нужно получить данные с пульта, кроме origin, вы можете сделать это с помощью git fetch <other_remote_name>. Эта ситуация весьма необычна, только что упомянута здесь для полноты.
paneer_tikka

1
Я чуть не ударился головой об ПК, пробуя все эти решения. Оказывается, в названии моей ветки была опечатка, глупая хе-хе.
Dev

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 checkout <имя ветки на источнике>.
БУДЬТЕ

--allникогда не является хорошей идеей, потому что он будет загружать каждый файл в каждой ветви. Это займет больше времени и места. Это лучше быть конкретным с именем ветви и сделать , как это
Honey

53

Используйте git branch -a(как локальные, так и удаленные филиалы) или git branch -r(только удаленные филиалы), чтобы просмотреть все пульты и их ветви. Затем вы можете сделатьgit checkout -t remotes/repo/branch удаленный и создать локальную ветвь.

Существует также команда git-ls-remote, чтобы увидеть все ссылки и теги для этого пульта.


git checkout remotes/repo/branchзаставляет git checkout искать путь, а не удаленное хранилище.
Эрин

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

43

Название и вопрос перепутаны:

  • Git получить удаленную ветку
  • как мой коллега может специально вытащить эту ветку.

Если вопрос в том, как мне заставить работать удаленную ветку или как Git оформить заказ на удаленную ветку? Более простое решение:

С Git (> = 1.6.6) вы можете использовать:

git checkout <branch_name>

Если local <branch_name>не найден, но существует ветвь отслеживания ровно на одном удаленном устройстве с соответствующим именем, обработайте его как эквивалент:

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

Смотрите документацию для Git Checkout

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

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

Спасибо, Гийом! Я просто использовал эту команду и написал пост об этом, чтобы изобразить мой точный случай: leniel.net/2014/05/…
Leniel Maccaferri

<! - git checkout <remote-branch-name> -> работает как положено, спасибо, Гийом!
Сачидананда Наик

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/…
Джеймс Рочабрун

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, 2nd Edition , написанный Скоттом Чаконом и Беном Штраубом (вырезано для удобства чтения)




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
это приведет к отключению состояния
головы



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 checkout: если <имя_ответа> не найдено, но существует ветвь отслеживания ровно на одном пульте с совпадающим именем, относитесь к ним как к: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) фактически позволяет вам клонировать только одну ветку:»
Питер Мортенсен

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_watch должно быть лучшим решением. Вы единственный человек, который опубликовал это как решение, и это сработало для меня. Это работает, потому что это обновит вашу ветку с главной веткой. просто и несложно.
Ян Постон Фреймер

3
проблема в том, что он попытается объединить эту удаленную ветку с вашей веткой CURRENT, которая не является удаленной (поскольку она является новой для вашего локального репо)
З. Хулла,

Это объединится с вашей текущей веткой.
Eem

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 shallow clone (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, а затем извлекаете данные из удаленной ветки, эта удаленная ветвь может находиться или не находиться на той же странице, что и master, и может
    вызывать

    Некоторое объяснение было бы в порядке.
    Питер Мортенсен
    Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
    Licensed under cc by-sa 3.0 with attribution required.