git: перемикайте гілку, не відриваючи голову


102

У мене є сховище на github з основною гілкою (master) та гілкою для деяких експериментальних робіт. Я зробив кілька комітетів і підштовхнувся до експериментальної гілки, і все було добре.

Тепер, на іншій машині, я намагаюся клонувати мій репозиторій (Git клон сховища ) , а потім перейти до експериментальної гілки (мерзотник контроль branchname ) , але кожен раз , коли я роблю це моя голова отримує стоїть окремо і я не можу натиснути мої зміни. Що я роблю неправильно? Я відчуваю, що я десь пропускаю фундаментальну концепцію git, але читання випадкових сторінок git man не дає мені ніяких підказів.

Я новачка в гтіні, тому мені шкода, якщо я ідіот, але я не можу знайти нічого в документах, які допоможуть мені знову приєднати голову.

EDIT

Концепція галузі відстеження - це те, чого я бракував. Тепер, коли я стою цю концепцію, все зрозуміло. Особисто я вважаю 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

Для зручності ви можете використовувати ту саму рядок для локальної назви та назви гілки.
Коли ви перевірили, origin/branchnameви не справді перевіряли гілку. origin/branchname"віддалене" ім'я, і ​​ви можете отримати їх список

branch -a 

Якщо ввімкнено кольори, місцеві гілки будуть одним кольором, а віддалені - іншим.

Спочатку потрібно зробити віддалену гілку відслідковуватися локально, щоб мати можливість перейти на роботу та працювати над нею.


9
Людина, чому "git checkout origin / назва гілки" не починає автоматично відстежувати гілку, якщо вона ще не відстежується?
— Мартін Конічек

4
тому що вам все ще потрібна місцева назва іноземної філії.
— Кент Фредрік

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

2
Дякую за пораду про кольори. Щоб увімкнути кольори:git config --global --add color.ui true
— PonyEars

1
Варто зазначити, що "походження / ім'я гілки" може бути буквально будь-яким, що відповідає SHA1 або SHA1 само по собі =). Я регулярно використовую це для створення довільних гілок з довільним корінням.
— Кент Фредрік

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

Тепер створіть гілку відстеження:

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

Потім, попрацювавши там, просто натисніть на github by

git push

3
git гілка -t походження / експериментальна # не потрібно набирати стільки :)
— Дастін

Гілка, яку я хочу відстежувати, називається тема / отримання. Коли я намагаюся зробити гілку $ git - відстежувати тему / витягувати за течією / тему / добирати, вона каже, фатальна: Недійсне ім'я об'єкта: 'upstream / topic / fetch'.
— улу

1
@Dustin, ця команда створює локальну гілку 'origin / експериментальна', яка відстежує місцевого ведучого. Я здогадуюсь, це досить поширена помилка.
— PDug

1
@PDug% git checkout -t походження / експериментальний експериментальний відділення, встановлене для відстеження віддалених експериментальних відділень від походження шляхом повторного використання. Перейшов до нової гілки "експериментально"
— Дастін

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.