git: переключить ветку без отсоединения головы


102

У меня есть репозиторий на github с основной веткой (master) и веткой для некоторых экспериментальных работ. Я сделал несколько коммитов и нажал на экспериментальную ветку, и все было в порядке.

Теперь, на другой машине, я пытаюсь клонировать мой репозиторий (Git клон репозитория ) , а затем перейти к экспериментальной ветви (мерзавец контроль branchname ) , но каждый раз , когда я делаю это моя голова получает отдельностоящий и я не могу нажать мои изменения. Что я делаю не так? У меня такое чувство, что где-то мне не хватает фундаментальной концепции git, но чтение случайных страниц руководства по git не дает мне никаких подсказок.

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

РЕДАКТИРОВАТЬ

Мне не хватало концепции ветки отслеживания. Теперь, когда я разобрался с этой концепцией, все ясно. Лично я считаюgit branch --track синтаксис гораздо более интуитивно понятен, чем git checkout -b branch-name origin/branch-name.

Спасибо за помощь!


Чтобы переключить ветку без отсоединения головы, с Git 2.23 (август 2019 г.) используйте git switch: см. Мой ответ ниже .
— VonC

Ответы:


115
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

Для удобства вы можете использовать одну и ту же строку для localname и branchname.
Когда вы выполнили проверку, origin/branchnameвы на самом деле не проверяли ветку. origin/branchnameэто "удаленное" имя, и вы можете получить их список с помощью

branch -a 

Если у вас включены цвета, локальные ветви будут одного цвета, а удаленные - другого.

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


9
Чувак, почему "git checkout origin / branchname" не начинает автоматически отслеживать ветку, если она еще не отслеживается?
— Мартин Коничек,

4
потому что вам все еще нужно местное название для иностранного филиала.
— Кент Фредрик

Вот что я делаю, и сообщение об ошибке: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: обновление путей несовместимо с переключением ветвей. Вы намеревались проверить 'upstream / topic / fetch', который не может быть разрешен как фиксация?
— ulu

2
Спасибо за подсказку о цветах. Чтобы включить цвета:git config --global --add color.ui true
— PonyEars

1
Стоит отметить, что "origin / branchname" может быть буквально любым, что разрешается в SHA1 или в SHA1 сам по себе =). Я регулярно использую это для создания произвольных веток с произвольными корнями.
— Kent Fredric

16
git clone git@github.com:abc/def.git
cd def

Теперь создайте ветку отслеживания:

git branch --track experimental origin/experimental
git checkout experimental

Затем, поработав там, просто нажмите на github с помощью

git push

3
git branch -t origin / экспериментальный # не нужно так много печатать :)
— Дастин

Ветка, которую я хочу отслеживать, называется topic / fetch. Когда я пытаюсь сделать $ git branch --track topic / fetch upstream / topic / fetch, он говорит, фатально: недопустимое имя объекта: 'upstream / topic / fetch'.
— ulu

1
@Dustin, эта команда создает локальную ветку origin / experimental, которая отслеживает локального мастера. Думаю, это довольно частая ошибка.
— PDug

1
@PDug% git checkout -t origin / experimental Настройка экспериментальной ветки для отслеживания удаленной экспериментальной ветки из источника путем перезагрузки. Перешел на новую ветку 'экспериментальную'
— Дастин

11

Чтобы расширить ответ Кента, после того, как вы сделаете клонирование, единственная ветка, которая у вас будет (пульты не учитываются), - это та, которая была активна в репозитории, из которого вы клонировали, - master в вашем случае.

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

$ git branch experimental origin/experimental

а затем проверьте это:

$ git checkout experimental

Однако Кент прав - эти две команды можно комбинировать.

$ git checkout -b experimental origin/experimental

3

В Git 2.23 (август 2019 г.) вы должны использовать git switchкоманду

Если у вас есть удаленная ветка с таким же именем, она будет автоматически отслеживаться:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.