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