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

5471

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

Теперь я пытаюсь проверить удаленную ветвь test.

Я пробовал:

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

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

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

  • 7
    @inger Но это не включает возможность переименовать новую локальную ветвь (если вы хотите позже --set-upstream и сохранить согласованность имен)
  • 13
    Я думаю, что эта тема бесполезна. Кажется, ничего не работает, первоначальный вопрос, похоже, был утерян во многих ответах. Я прочитал каждое слово, попробовал все ниже и не знаю, как сделать то, что хочет сделать ОП.
Показать ещё 5 комментариев
Теги:
git-checkout

26 ответов

8344
Лучший ответ

Обновить

Ответ Якуба на самом деле улучшает это. С версиями 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
  • 364
    Чтобы расширить это: git не позволяет вам работать на чьих-либо ветках. Вы можете работать только самостоятельно. Поэтому, если вы хотите добавить в чью-то ветку, вам нужно создать свою собственную «копию» этой ветки, что и делает вышеуказанная команда (ну, она тоже создает вашу ветку и проверяет ее).
  • 132
    Если это новая удаленная ветка, вам может потребоваться выполнить git fetch прежде чем делать это, чтобы git знал о origin/test
Показать ещё 27 комментариев
1090

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

git checkout test

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


Вывод * (no branch) in git branch означает, что вы находитесь в неназванной ветки в так называемом состоянии "отсоединенный HEAD" (HEAD указывает непосредственно на фиксацию и не является символической ссылкой на некоторую локальную ветвь). Если вы сделали некоторые коммиты в этой неназванной ветки, вы всегда можете создать локальную ветвь с текущей фиксацией:

git checkout -b test HEAD
  • 31
    Неудивительно, но эта версия была выпущена в последние несколько лет - знание этого синтаксиса может сэкономить много времени, так как все еще остается много старой документации и потоков комментариев, предлагающих более старый метод для этого.
  • 10
    "современный мерзавец" - для записи, (приблизительно), на какую версию вы ссылаетесь? Иногда нам приходится работать на системах, работающих под управлением старых дистрибутивов.
Показать ещё 14 комментариев
483

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

$ git branch test origin/test

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

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

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

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

$ git checkout -b remote_branch origin/remote_branch

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

Решение

Если вы получили это сообщение, вы должны сначала сделать 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» означает хранилище источника, с которым вы установили связь.
  • 0
    git checkout -b newbranch также отлично git checkout -b newbranch для создания одного шага и извлечения новой ветви на основе текущей ветви.
Показать ещё 3 комментария
218

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

git fetch origin 'remote_branch':'local_branch_name'

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

  • 30
    Это работало для меня, когда ни git fetch origin, ни git remote update не создавали локальные ветви. Я не уверен почему.
  • 1
    это зависит от версии git, но, похоже, это стало возможным благодаря последней версии.
Показать ещё 14 комментариев
104

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

$ git checkout -t remote_name/remote_branch

Чтобы добавить новый пульт дистанционного управления, вам необходимо сделать следующее:

$ git remote add remote_name location_of_remote
$ git fetch remote_name

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

98

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

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

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

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

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

Вам нужно fetch ветку...

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

git fetch && git checkout test

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

Изображение 7451

  • 6
    Отличная картина, спасибо
  • 0
    Не работает, если нет test локальной ветки
Показать ещё 4 комментария
46

Чтобы клонировать репозиторий 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.

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

  • 0
    git clone <ssh url / http url> - отлично работает для меня
  • 0
    Да вы правы. Спасибо за вашу информацию, я обновлю ее очень скоро @warvariuc
Показать ещё 1 комментарий
32

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

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, потому что он установлен по умолчанию, как объяснялось в предыдущем ответе .
26

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

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

git fetch origin branch_name

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

git checkout -b branch_name origin/branch_name

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

  • 0
    Я не понимаю -b. Если вы можете сделать «git checkout master», почему вы не можете сделать «git checkout origin / test»?
  • 0
    -b для новой ветки от источника / мастера
25

Команды

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

23

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

git checkout --track origin/other_remote_branch
  • 11
    Этот ответ будет гораздо полезнее, если вы объясните, почему вы используете его таким образом. то есть, почему кто-то должен использовать '--track' и так далее ...
21

Если ветка находится на чем-то, кроме удаленного 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
15

git fetch && git checkout your-branch-name

15

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

git remote update

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

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

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

  • 2
    К вашему сведению, git remote update также извлекает все удаленные ветви .
14

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

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

  • 0
    Благодарю. Мне было интересно, должен ли я использовать полный путь ( 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'
  • 0
    Большое спасибо @brianyang
11

Команда 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
  • 0
    @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 не перечислены все удаленные ветви с одной клонированной веткой хранилища.
8

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

git проверочный тест, который ничего не делает

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

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

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

Когда git checkout xxx разобрался,

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

Я застрял в ситуации, когда произошла 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
6

Просто запустите 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, в которой при удалении такой неоднозначности указывается значение удаленного управления по умолчанию.

6

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

git fetch

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

git checkout BranchName
6

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

#!/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 ;
2

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

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'
1

Получить происхождение и проверить ветку.

git fetch origin && git checkout branch_name 
0

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

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

Изображение 7452

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

$ git checkout -b '#9773' origin/'#9773'
  • 0
    Во многих оболочках Unix символ # используется для комментариев, поэтому все, что после # будет игнорироваться. Это вещь оболочки, а не что-то конкретное для git. Использование кавычек обратной косой черты до # должно быть достаточно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню