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

Это команды, которые я выполнил. Но это определенно не работает.

Я хочу иметь возможность проверить эту ветку, а затем отправить и зафиксировать только изменения веток от различных соавторов или рабочих станций .

Дэвид
источник
9
возможный дубликат удаленной ветки git checkout
Эндрю Маршалл
33
Я использовал:, git fetch --allЗатем, чтобы просмотреть все ветви:, git branchЗатем я проверяю филиал:git checkout nameofnewbranch
Джефф Маттсон
проверьте свой вопрос и /programming/1072261/push-and-pull-branches-in-git/47780374#47780374
Rizo
Возможный дубликат Как мне проверить удаленную ветку Git?
DaveyDaveDave
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 - Удаленные ветки, отслеживание веток

ralphtheninja
источник
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>

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

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

ManuelSchneid3r
источник
Эти
короткие
25

С помощью этой простой команды:

git checkout -b 'your_branch' origin/'remote branch'
Картик Дамодара
источник
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
это приведет к отключению состояния
головы
15

Вы также можете получить и оформить удаленную ветку за один раз:

git fetch && git checkout the-branch-name
Кумар Самбхав
источник
14
git fetch

git branch -r

git checkout <branch_name>
Джон Родригес
источник
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

Это обеспечит клонирование удаленной ветви в вашу локальную ветку с именем удаленной ветви.

Теперь, если вы передадите свой код и нажмете, код будет отправлен только в эту ветку.

ganezdragon
источник
Связанный: Как мне клонировать одну ветку в 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 вашего пульта.

zafar142003
источник
8

git fetch --all & git checkout <branch name>

Джером Энтони
источник
7

git fetch && git checkout <your friend's branch name> должен сделать трюк

tambakoo
источник
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. обнаружить в вашем местном списке.
Харицинь Гохил
источник
7

Если вы хотите получить все удаленные ветки, просто введите:

git fetch --all
Ишвор Ханал
источник
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

Затем сделайте из него новые ветви.

SoEzPz
источник
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 branch <name> --track origin/<name>

Крис Ф. Кэрролл
источник
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поможет вам создать локальную ветку, в которой есть все изменения в удаленной ветке.

    Sijeesh
    источник
    -2
    git checkout -b branch_name
    git pull remote_name branch_name
    
    Леон
    источник
    3
    Хотя этот фрагмент может ответить на вопрос, лучше включить некоторые пояснения о том, что он делает и чем он отличается от очень большого числа ответов, уже здесь.
    DaveyDaveDave
    2
    Мне лично не нравится этот вариант. Потому что в случае, если вы создаете новую ветку из Master, а затем извлекаете данные из удаленной ветки, эта удаленная ветвь может находиться или не находиться на той же странице, что и master, и может
    вызывать
    Некоторое объяснение было бы в порядке.
    Питер Мортенсен