Как проверить удаленную ветку Git?


6715

Кто-то отправил ветку testс git push origin testобщим хранилищем. Я вижу ветку с git branch -r.

Сейчас я пытаюсь проверить удаленную testветку.

Я пробовал:

  • git checkout test который ничего не делает

  • git checkout origin/testдает * (no branch). Что сбивает с толку. Как я могу быть на "нет ветви"?

Как проверить удаленную ветку Git?


9
@inger Но это не включает в себя возможность переименовать новую локальную ветвь (если вы хотите позже --set-upstream и сохранить последовательность имен)
fachexot

15
Я думаю, что эта тема бесполезна. Кажется, ничего не работает, первоначальный вопрос, похоже, был утерян во многих ответах. Я прочитал каждое слово, попробовал все ниже и понятия не имею, как сделать то, что хочет сделать ОП.
Тони Эннис

6
Команды Git для начала не интуитивны, добавьте изменения, внесенные в последние версии, в микшер, и у вас есть эта страница ...
Кристоф Русси,

14
Я чувствую, что принимаю сумасшедшие таблетки. Я пытаюсь оформить ответвление upstream, а не просто origin, и каждый рекомендуемый ответ не делает ничего полезного (каламбур). РЕДАКТИРОВАТЬ - извините, множество предложений, содержащихся в топ-2 ответов были бесполезны; 3-й ( git branch test origin/test) это то, что работает. Рад, что в топ-2 количество голосов в 20 раз больше ...
dwanderson

4
Возможно, у вас есть файл с именем «test» в вашем рабочем дереве, подробнее см. Stackoverflow.com/a/45006389/792416 .
старик

Ответы:


9151

Обновить

Ответ Якуба на самом деле улучшает это. С версиями Git ≥ 1.6.6 с одним пультом вы можете просто:

git fetch
git checkout test

Как указывает пользователь masukomi в комментарии, git checkout testон не будет работать в современном git, если у вас есть несколько пультов. В этом случае используйте

git checkout -b test <name of remote>/test

или стенография

git checkout -t <name of remote>/test

Старый ответ

Прежде чем вы сможете начать локальную работу с удаленной веткой, вам нужно получить ее, как указано в ответах ниже.

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

git fetch origin

Это принесет вам все удаленные ветви. Вы можете увидеть ветки, доступные для оформления заказа с:

git branch -v -a

Теперь, когда у вас есть удаленные ветви, вам нужно проверить интересующую вас ветку, предоставив вам локальную рабочую копию:

git checkout -b test origin/test

398
Чтобы расширить это: git не позволяет вам работать на чьих-либо ветках. Вы можете работать только самостоятельно. Поэтому, если вы хотите добавить в чью-то ветку, вам нужно создать свою собственную «копию» этой ветки, что и делает вышеуказанная команда (ну, она тоже создает вашу ветку и проверяет ее).
Дэн Молдинг

139
Если это новая удаленная ветка, вам может понадобиться git fetchэто сделать, чтобы git был в курсеorigin/test
Нил Саркар

56
... и вы могли бы сделать это сgit fetch origin test
Andrew

22
Ошибка: «git checkout: обновление путей несовместимо с переключением ветвей. Вы намеревались origin/testоформить заказ, который не может быть разрешен как коммит?»
Xeoncross

85
git checkout testНЕ будет работать в современном git, если у вас есть несколько пультов с одинаковым именем ветви . Он не может знать, какой из них использовать.
Масукоми

1256

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

git checkout test

(обратите внимание, что это «тест», а не «происхождение / тест»), чтобы выполнить магическую DWIM- метрику и создать для вас локальную ветвь «тест», для которой восходящая ветвь будет ветвью удаленного отслеживания «происхождение / тест».


* (no branch)В git branchвыходных означают , что вы находитесь на безымянной отрасли, в так называемом «отдельностоящий HEAD» состоянии (точки ГОЛОВЫ непосредственно совершать, а не символическая ссылка на какой - то местный филиал). Если вы сделали некоторые коммиты в этой безымянной ветви, вы всегда можете создать локальную ветку вне текущей фиксации:

git checkout -b test HEAD

** РЕДАКТИРОВАТЬ (редактором, а не автором) **

Я нашел комментарий, похороненный ниже, который, кажется, модернизирует этот ответ:

@Dennis: git checkout, например, результаты git checkout origin / test в отдельном HEAD / безымянной ветви, в то время как git checkout test или git checkout -b test origin / test результаты в локальном тесте ветвления (с удаленным отслеживанием origin / test ветки в качестве восходящего потока) ) - Якуб Наребски 9 января '14 в 8:17

акцент на git checkout origin/test


33
Неудивительно, но эта версия была выпущена в последние несколько лет - знание этого синтаксиса может сэкономить много времени, так как все еще остается много старой документации и потоков комментариев, предлагающих более старый метод для этого.
Кертис

10
"современный мерзавец" - для записи, (приблизительно), на какую версию вы ссылаетесь? Иногда нам приходится работать на системах, работающих под управлением старых дистрибутивов.
Крейг МакКуин

5
"современный мерзавец" в этом контексте - мерзавец 1.6.6
Бобби Нортон

10
@aidan Если вы получили такой ответ, error: pathspec 'branch_name' did not match any file(s) known to git.сначала вы должны сделать git fetch.
Деннис

6
Использование git версии 1.8.3.msysgit.0, и это не работает для меня - не соответствует ни один файл (ы), известные git - я сделал много
выборок

565

В этом случае вы, вероятно, захотите создать локальную testветку, которая отслеживает удаленную testветку:

$ git branch test origin/test

В более ранних версиях gitвам требовался явный --trackпараметр, но теперь он используется по умолчанию при переходе от удаленной ветви.


15
Это создаст локальную ветку без переключения на нее.
Алексей Скрипник,

2
Хотя я получил фатальное: неоднозначное имя объекта: 'origin / dev' - где ветка 'dev' на origin наиболее определенно существует - но я случайно создал ветку с именем "origin / dev" на моей машине (в моих предыдущих глупых попытках без сомнения, чтобы понять это правильно ...
ой

1
Это приводило меня к ошибке: не удалось подтолкнуть некоторые ссылки к подсказке: обновления были отклонены, потому что за удаленной подсказкой: коллега скрыта подсказка с нажатой ветвью. Проверьте эту ветку и объедините подсказку удаленных изменений: (например, «git pull») перед повторным нажатием. Подсказка: подробности см. в «Замечании о быстрой перемотке вперед» в «git push --help».
pal4life

475

Принятый ответ не работает для вас?

Хотя первый и выбранный ответ технически верен , есть вероятность, что вы еще не получили все объекты и ссылки из удаленного репозитория. Если это так, вы получите следующую ошибку:

$ git checkout -b remote_branch origin/remote_branch

fatal: git checkout: обновление путей несовместимо с переключением веток.
Вы намеревались оформить 'origin / remote_branch', который не может быть разрешен как коммит?

Решение

Если вы получили это сообщение, перед запуском вы должны сначала указать git fetch originгде originнаходится имя удаленного репозитория git checkout remote_branch. Вот полный пример с ответами:

$ git fetch origin
remote: Counting objects: 140, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 69 (delta 36), reused 66 (delta 33)
Unpacking objects: 100% (69/69), done.
From https://github.com/githubuser/repo-name
   e6ef1e0..5029161  develop    -> origin/develop
 * [new branch]      demo       -> origin/demo
   d80f8d7..359eab0  master     -> origin/master

$ git checkout demo
Branch demo set up to track remote branch demo from origin.
Switched to a new branch 'demo'

Как видите, во время работы были git fetch originполучены любые удаленные ветви, которые мы еще не настроили для отслеживания на нашей локальной машине. Оттуда, поскольку теперь у нас есть ссылка на удаленную ветку, мы можем просто запустить ее, git checkout remote_branchи мы получим преимущества удаленного отслеживания.


2
Я добавлю примечание, если у вас есть отдельная ветка локально: Убедитесь, что вы связали это с удаленным репозиторием, используя 'git remote add origin [the_path_to_your_repo / repo_name.git]'. Затем используйте «git fetch origin», где «origin» означает хранилище источника, с которым вы установили связь.
elliotrock

git checkout -b newbranchтакже отлично подходит для создания одного шага и извлечения новой ветви на основе текущей ветви.
Линус

2
Я думаю, что это самое современное (оно постоянно меняется!). Git 2.5.5 Я обнаружил, что единственный способ увидеть удаленные ветви - git ls-remoteэто единственный способ git checkout -b [branch] --track [remote/branch]... и это после работы git pull [remote] [branch] . То есть фактически вытянул всю ветку, но все равно не перечислил бы ее.
delicateLatticeworkFever

и когда этот ответ тоже не работает, посмотрите этот .
эйс

просто добавить, если вы git fetch other_remote only_branch, вы все еще получаете fatalошибку. Вы должны git fetch other_remoteбез названия филиала. Странный дизайн.
Текущая

258

Я попробовал вышеуказанное решение, но оно не сработало. Попробуйте это, это работает:

git fetch origin 'remote_branch':'local_branch_name'

Это приведет к извлечению удаленной ветви и созданию новой локальной ветви (если она еще не существует) с именем local_branch_nameи отслеживанию удаленной ветви в ней.


37
Это работало для меня, когда ни git fetch origin, ни git remote update не создавали локальные ветви. Я не уверен почему.
Кузнец

4
Это был самый прямой способ выполнить то, что мне было нужно - использовать удаленную ветвь (не ведущую) для создания новой ветки.
Рорали

7
Работал без сбоев, особенно когда клонировал одну ветку с пульта с несколькими ветками.
Алекс С

7
это работало и для меня, где принимали ответы, а другие проголосовавшие - нет. Моя версия git
2.5.0

5
Кто-нибудь знает, почему это работает, когда все остальное не работает? (Я на Git 2.13.0)
Натан Артур

108

Это будет DWIM для удаленного безымянного источника ( документация ):

$ git checkout -t remote_name/remote_branch

Чтобы добавить новый пульт, сначала нужно сделать следующее:

$ git remote add remote_name location_of_remote
$ git fetch remote_name

Первый сообщает Git, что удаленный существует, второй получает коммиты.


104

Использование:

git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>

Другие ответы не работают с современным Git в моем случае. Возможно, вам придется сначала потянуть, если удаленная ветвь новая, но я не проверял этот случай.


2
Ты понимаешь, что это выдержка из этого ответа
Томас Аюб

14
Глядя на это сейчас, они перекрывают друг друга. Только мое краткое и говорит вам, что делать, а не рассказывать историю. Я предполагаю, что это может быть более полезным, особенно для современных версий git. Вы можете понизить это, если считаете, что это плохой ответ.
matanster

1
git fetch - безопасный вариант. Попробуйте получить перед использованием pull. Оба загружают удаленный контент, но пока fetch не меняет локальное состояние, pull немедленно изменит локальное состояние.
Питер

89

Хорошо , ответ прост ... Вы в основном видите ветку, но у вас еще нет локальной копии! ...

Тебе нужно fetchв ветку ...

Вы можете просто получить, а затем оформить заказ в ветке, используя команду из одной строки ниже, чтобы сделать это:

git fetch && git checkout test

Я также создал изображение ниже, чтобы вы могли поделиться своими различиями, посмотреть, как это fetchработает, а также чем оно отличается pull:

мерзкий выбор


@DmitriZaitsev да, это будет работать, если удаленная ветвь есть, и вы делаете выборку, вы получите ветку локально ... git fetch && git checkout test .. Так что это работает, если только нет удаленной ветви, но вопрос о том, что там уже есть удаленная ветвь ...
Alireza

То, как я вижу вопрос, testвыглядит как новая ветка, поэтому вряд ли она будет присутствовать локально. В противном случае вы можете сделать это проще с помощью одной git pullкоманды.
Дмитрий Зайцев

@DmitriZaitsev, да, именно поэтому я сказал git fetch, что проверка для только что созданных удаленных веток, pull может принести другие нежелательные вещи, но fetch делает все ветки доступными, если у вас уже есть репо локально ...
Alireza

Не было бы fetchбез pullизменений отпусков в извлеченной копии , но не в местном отделении, ведущие к местному отделению не в последнюю дату?
Дмитрий Зайцев

56

Чтобы клонировать Git-репозиторий, выполните:

git clone <either ssh url /http url>

Приведенная выше команда проверяет все ветви, но только masterветвь будет инициализирована. Если вы хотите оформить заказ в других филиалах, сделайте:

git checkout -t origin/future_branch (for example)

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

Если вы хотите переопределить название вашего местного отделения при оформлении заказа:

git checkout -t -b enhancement origin/future_branch

Теперь имя вашей локальной ветки есть enhancement, а имя вашей удаленной веткиfuture_branch .

Документация


Git Clone <либо SSH URL / HTTP URL> - отлично работает для меня
Kmeixner

Да вы правы. Спасибо за вашу информацию, я обновлю ее очень скоро @warvariuc
Мадхан Айясами

Если пульт не имеет master, это не будет работать.
polkovnikov.ph

36

Ты можешь попробовать

git fetch remote
git checkout --track -b local_branch_name origin/branch_name

или

git fetch
git checkout -b local_branch_name origin/branch_name

2
К вашему сведению, --trackв более новых версиях git больше не требуется, потому что он установлен по умолчанию, как объяснялось в предыдущем ответе .

33

Во-первых, вам нужно сделать:

git fetch # Если вы не знаете название ветви

git fetch origin branch_name

Во-вторых, вы можете проверить удаленный филиал в вашей локальной сети:

git checkout -b branch_name origin/branch_name

-b создаст новую ветку с указанным именем из выбранной вами удаленной ветки.


Я не понимаю -b. Если вы можете сделать «git checkout master», почему вы не можете сделать «git checkout origin / test»?
Джон Литтл

-б для новой ветви, которая от происхождения / мастер
Мохидин бен Мухаммед

28

Я использую следующую команду:

git checkout --track origin/other_remote_branch

13
Этот ответ будет намного полезнее, если вы объясните, почему вы используете его таким образом. то есть, почему кто-то должен использовать '--track' и так далее ...
Мэтт Фридман

27

команды

git fetch --all
git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>

равны

 git fetch --all

а потом

 git checkout -b fixes_for_dev origin/development

Оба создадут latest fixes_for_devизdevelopment


24

Если ветка находится на чем-то другом, а не на originудаленном, я хотел бы сделать следующее:

$ git fetch
$ git checkout -b second/next upstream/next

Это извлечет nextветку на upstreamудаленном узле в локальную ветвь с именем second/next. Это означает, что если у вас уже есть локальная ветка с именем next, она не будет конфликтовать.

$ git branch -a
* second/next
  remotes/origin/next
  remotes/upstream/next


18

ни один из этих ответов не работал для меня. это сработало:

git checkout -b feature/branch remotes/origin/feature/branch


1
Спасибо. Мне было интересно, должен ли я использовать полный путь ( remotes / origin / feature / branch ), который я видел gitпри вызове git branch -aкоманды, но я не был уверен, поэтому я просто использовал, git checkout -b apps/FEATURE/branch origin/apps/FEATURE/branchи это, казалось, работало. Сообщение:Branch 'apps/FEATURE/branch' set up to track remote branch 'apps/FEATURE/epicBranch' from 'origin'. Switched to a new branch 'apps/FEATURE/branch'
Chris22

18

Я застрял в ситуации, видя error: pathspec 'desired-branch' did not match any file(s) known to git.все предложения выше. Я на git версии 1.8.3.1.

Так что это сработало для меня :

git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD

Объяснение этому заключается в том, что я заметил, что при извлечении удаленной ветви она была выбрана в FETCH_HEAD:

$ git fetch origin desired-branch
From github.com:MYTEAM/my-repo
    * branch            desired-branch -> FETCH_HEAD

17

Просто запустите git checkoutс именем удаленной ветви. Git автоматически создаст локальную ветку, которая отслеживает удаленную:

git fetch
git checkout test

Однако, если это имя ветки найдено более чем в одном пульте, это не сработает, так как Git не знает, какой использовать. В этом случае вы можете использовать либо:

git checkout --track origin/test

или

git checkout -b test origin/test

В 2.19 Git изучил checkout.defaultRemoteконфигурацию, которая указывает удаленное устройство по умолчанию при разрешении такой неоднозначности.


16

git branch -rговорит, что имя объекта недопустимо, потому что это имя ветки отсутствует в списке локальных веток Git. Обновите ваш локальный список филиалов от источника:

git remote update

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

Это сработало для меня.

Я считаю, что git fetchтянет во всех удаленных ветвях, что не то, что хотел оригинальный плакат.


2
К вашему сведению, git remote update также получит все удаленные ветки .

13

git remote show <origin name> выведет список всех ветвей (включая не отслеживаемые). Затем вы можете найти имя удаленной ветви, которое вам нужно получить.

Пример:

$ git remote show origin

Используйте эти шаги для извлечения удаленных веток:

git fetch <origin name> <remote branch name>:<local branch name>
git checkout <local branch name > (local branch name should the name that you given fetching)

Пример:

$ git fetch origin test:test
$ git checkout test

@hallski ответил, что не работают версии 2.15.1, но я уменьшил вес файла .git, клонировал только 1 ветку и отфильтровал историю с флагом --depth. Например, не $ git clone -b release --single-branch --depth 5 https://github.com/user/repo.gitуказана информация, $ git remote show originчто не перечислены все удаленные ветви с клонированными репозиториями с одной веткой.
Qh0stM4N

10

Получить с пульта и проверить филиал.

git fetch <remote_name> && git checkout <branch_name> 

Например:

функция git fetch origin && git checkout / XYZ-1234-Add-alerts


9

Другие парни и девушки дают решения, но, может быть, я могу сказать вам, почему.

git checkout test, который ничего не делает

Does nothingне равно doesn't work, так что я думаю, когда вы наберете «git checkout test» в своем терминале и нажмете клавишу ввода, сообщение не появится и не возникнет ошибка. Я прав?

Если ответ «да», я могу сказать вам причину.

Причина в том, что в вашем рабочем дереве есть файл (или папка) с именем «test».

Когда git checkout xxxразбирается,

  1. xxxСначала Git выглядит как имя ветки, но нет ни одной ветки с именем test.
  2. Тогда Git думает, что xxxэто путь, и, к счастью (или, к сожалению), существует файл с именем test. Так git checkout xxxзначит откажитесь от любой модификации вxxx файле.
  3. Если файл также не назван xxx, Git попытается создать файл xxxсогласно некоторым правилам. Одним из правил является создание ветки с именем, xxxесли она remotes/origin/xxxсуществует.

спасибо, продолжал пытаться выяснить, почему Git ничего не делал.
Майк Р

8

Чтобы получить вновь созданные филиалы

git fetch

Переключиться на другую ветку

git checkout BranchName

6

Вы можете начать отслеживать все удаленные ветви с помощью следующего скрипта Bash:

#!/bin/bash
git fetch --all
for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`
  do git branch -f --track "$branch" "origin/$branch"
done

Вот также однострочная версия:

git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ;

5

git checkout -b "Branch_name" [B означает Создать локальную ветку]

git branch --all

git checkout -b "Название вашей ветки"

мерзавец ветка

успешно оформить заказ из главной ветки в ветку разработчика

введите описание изображения здесь


git checkout -b "Branch_name" [B означает Создать локальную ветку]
Кешав Гера

3

чтобы получить все удаленные ветки, используйте это:

git fetch --all

затем оформить заказ в филиал:

git checkout test

2

Используйте, fetchчтобы вытащить весь ваш пульт

   git fetch --all

Для просмотра удаленных филиалов:

   git branch -r

Для списка всех ваших филиалов

   git branch -l
   >>outpots like-
     * develop
       test
       master

Оформить заказ / сменить ветку

   git checkout master

Пробовал git branch -lи удаленной ветки не показывалось.
Дмитрий Зайцев

использовать git pull --allилиgit fetch --all
Насир Хан

Да и после этого git branch -l пока показывает только локальные филиалы. Кажется, он работает точно так же, как и git branchбез него -l, так в чем причина -l?
Дмитрий Зайцев

Также ваш ответ не отвечает на вопрос - masterэто не удаленная ветка.
Дмитрий Зайцев

1
-lфлаг для списка. Вы можете использовать --listтоже
Насир Хан

2

Для нас, кажется, remote.origin.fetchконфигурация дала проблему. Поэтому мы не могли видеть никаких других удаленных веток, чем master, поэтому git fetch [--all]не помогли. Ни то, git checkout mybranchни другоеgit checkout -b mybranch --track origin/mybranch не работало, хотя, конечно, это было на расстоянии.

Предыдущая конфигурация позволила masterполучить только:

$ git config --list | grep fetch
remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master

Исправьте это с помощью *и получите новую информацию из источника:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

$ git fetch
...
 * [new branch] ...
...

Теперь мы можем git checkoutудаленную ветку локально.

Не знаю, как этот конфиг оказался в нашем локальном репо.


1
Это решило это для меня, так как я клонировал одну ветку
Pontus Holmbom

2

Если имя удаленной ветви начинается со специальных символов, вам нужно использовать одинарные кавычки в команде checkout, иначе git не будет знать, о какой ветке вы говорите.

Например, я попытался извлечь удаленную ветку с именем as, #9773но команда не работала должным образом, как показано на рисунке ниже:

введите описание изображения здесь

По какой-то причине мне стало интересно, может ли острый символ (#) иметь к этому какое-то отношение, а затем я попытался '#9773'заключить имя ветви в одинарные кавычки, например, raten than just #9773, и, к счастью, оно работало нормально.

$ git checkout -b '#9773' origin/'#9773'

Во многих оболочках Unix #символ используется для комментариев, поэтому все, что #будет после, будет игнорироваться. Это вещь оболочки, а не что-то конкретное для git. Использование кавычек обратной косой черты перед #должно быть достаточно.
Пауло Скардин

1

Пожалуйста, следуйте команде, чтобы создать пустую папку. Введите это и используйте эту команду:

saifurs-Mini:YO-iOS saifurrahman$ git clone your_project_url
Cloning into 'iPhoneV1'...
remote: Counting objects: 34230, done.
remote: Compressing objects: 100% (24028/24028), done.
remote: Total 34230 (delta 22212), reused 15340 (delta 9324)
Receiving objects: 100% (34230/34230), 202.53 MiB | 294.00 KiB/s, done.
Resolving deltas: 100% (22212/22212), done.
Checking connectivity... done.
saifurs-Mini:YO-iOS saifurrahman$ cd iPhoneV1/
saifurs-Mini:iPhoneV1 saifurrahman$ git checkout 1_4_0_content_discovery
Branch 1_4_0_content_discovery set up to track remote branch 1_4_0_content_discovery from origin.
Switched to a new branch '1_4_0_content_discovery'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.