Git получить удаленную ветку - PullRequest
1943 голосов
/ 02 марта 2012

Мой коллега и я работаем над одним и тем же репозиторием, который мы технически разветвляли на две ветви, каждая для разных проектов, но у них есть сходства, поэтому мы иногда захотим зафиксировать *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

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

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

Ответы [ 29 ]

2660 голосов
/ 02 марта 2012

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

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

git checkout --track origin/daves_branch

--track - сокращение от git checkout -b [branch] [remotename]/[branch], где [remotename] равно origin в этом случае и [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 эта команда не будет создаватьместный филиал, и вы переведете вас в состояние «отделенная ГОЛОВА».Если вы хотите локальное отделение, используйте опцию --track.Полная информация здесь: http://git -scm.com / book / ru / v2 / Git-Branching-Remote-Branches # Отслеживающие ветви

864 голосов
/ 19 апреля 2013

Я использовал fetch, затем checkout ...

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

... где <rbranch> - удаленная ветвь или исходный код и <lbranch> - это пока еще несуществующая локальная ветвь или пункт назначения , который вы хотите отслеживать и который вы, вероятно, хотите назвать так же, какудаленная ветка или ссылка на источникЭто объясняется в options в объяснении <refspec>.

Git настолько умен, что автоматически завершает первую команду, если я tab после первогонесколько букв удаленной ветки.IE: мне даже не нужно называть локальную ветку, Git автоматически копирует для меня имя удаленной ветви.Спасибо, Git!

Также как ответ в этом похожем сообщении SO показывает, что если вы не называете локальную ветвь в fetch, вы все равно можете создать ее, когда выпроверьте это с помощью флага -b. IE: git fetch <remote> <branch>, за которым следует git checkout -b <branch> <remote>/<branch>, делает то же самое, что и мой первоначальный ответ.И, очевидно, если в вашем репо есть только один пульт, тогда вы можете просто сделать git checkout <branch> после fetch, и он создаст для вас локальную ветку. EG: Вы только что клонировали репозиторий и хотите проверить дополнительные ветви с пульта.

Я полагаю, что часть документации для fetch может быть скопирована дословно из pull.В частности, раздел для <refspec> в options такой же.Тем не менее, я не верю, что fetch когда-либо merge, поэтому, если вы оставите целевую сторону пустым, fetch ничего не будет делать .

ПРИМЕЧАНИЕ: git fetch <remote> <refspec> - это сокращение от git fetch <remote> <refspec>:, которое, следовательно, ничего не будет делать, но git fetch <remote> <tag> - это то же самое, что git fetch <remote> <tag>:<tag>, который должен копировать удаленный <tag> локально.

Я думаю,это полезно только в том случае, если вы хотите скопировать удаленную ветку локально, но не обязательно сразу проверить ее.В противном случае я бы сейчас использовал принятый ответ выше , что подробно объясняется в первом разделе описания оформления заказа , а затем в разделе options под объяснением--track, так как это 1-вкладыш. Ну ... вроде 1-строчного, потому что вам все равно придется сначала запустить git fetch <remote>.

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

329 голосов
/ 17 мая 2013

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

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

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

106 голосов
/ 12 ноября 2013

Чтобы оформить заказ на myBranch, который существует удаленно, а не локально - это работает для меня:

git fetch --all
git checkout myBranch

Я получил это сообщение:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'
46 голосов
/ 02 марта 2012

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

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

37 голосов
/ 31 марта 2014

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

  • Git fetch remote branch
  • как мой коллега может специально использовать эту ветку.

Если вопрос заключается в том, как заставить удаленную ветку работать с ней или как получить извлечение удаленной ветви, более простое решение:

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

git checkout <branch_name>

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

21 голосов
/ 18 мая 2017

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

git checkout -b 'your_branch' origin/'remote branch'
15 голосов
/ 06 октября 2017

Самый простой способ сделать это, по крайней мере, для меня:

git fetch origin <branchName>
14 голосов
/ 17 сентября 2018

Что мне помогло:

1) Для просмотра всех доступных удаленных веток (например, 'имя-удаленного филиала')

git branch -r

2) Создание локальной ветки с использованием имени удаленной ветви

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