Git витягнути певну гілку з GitHub


631

У мене є проект з кількома філіями. Я підштовхував їх до GitHub , і тепер, коли хтось інший працює над проектом, мені потрібно витягнути їх гілки з GitHub. Це добре працює у майстра. Але скажіть, що хтось створив філію xyz. Як я можу витягнути гілку xyzз GitHub і об'єднати її у гілку xyzна своїй localhost?

Я фактично маю тут свою відповідь: Натискайте і тягніть гілки в Git

Але я отримую помилку "! [Відхилено]" і щось про "не швидкий вперед".

Будь-які пропозиції?


3
яка фактична команда, яку ви виконуєте?
Олексій Н.

1
Це може отримати збій із повідомленням "не швидкий вперед". Чи ви змінили гілку віддаленого відстеження (origin / xyz), або галузь перемотана / переписана у віддалене сховище? Вам потрібно використовувати " git fetch origin --force", але прочитайте документацію перед цим.
Якуб Нарбський

Відповіді:


756

Але я отримую помилку "! [Відхилено]" і щось про "не швидкий вперед"

Це тому, що Git не може об'єднати зміни з гілок у вашого поточного майстра. Скажімо, ви перевірили гілку master, і ви хочете об'єднатись у віддалену гілку other-branch. Коли ви це зробите:

$ git pull origin other-branch

Git в основному робить це:

$ git fetch origin other-branch && git merge other-branch

Тобто, a pull- це лише fetchслідом за a merge. Однак, коли pull-ву, Git буде тільки зливатися , other-branch якщо він може виконувати швидко вперед злиття. Швидко вперед злиття злиття , в якому глава філії ви намагаєтеся злитися є прямим нащадком глави філії ви хочете об'єднати. Наприклад, якщо у вас є це дерево історії, то об'єднання other-branchпризведе до швидкого злиття вперед:

O-O-O-O-O-O
^         ^
master    other-branch

Однак це не буде швидким злиттям вперед:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Щоб вирішити свою проблему, спершу отримайте віддалену гілку:

$ git fetch origin other-branch

Потім об'єднайте його у свою поточну гілку (я вважаю, що це master) та виправте будь-які конфлікти злиття:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

Ні, проблема полягає в отриманні, а не з кроком злиття.
Якуб Нарбський

3
Як правило, пульти встановлюються таким чином, що витяги примусові, навіть якщо вони не призводять до швидкої передачі вперед, тому це не повинно відбуватися, якщо OP не змінить щось із звичайною конфігурацією. Проблема швидкого перемотування вперед може виникнути під час вилучення або злиття. Що змушує вас сказати, що проблема, безумовно, полягає в отриманні, а не в злитті?
mipadi

Я виконую ці кроки (витяг, злиття). Гіт каже мені, що робити нічого. Коли я намагаюся взяти на себе зобов’язання, вона перестає стогнати швидкими вперед.
Жан Йордаан

1
@mipadi У мене була така ж проблема, як Жан, і, хоча я не можу сказати, що дистанційне налаштування не за замовчуванням, про який ви згадали, я можу сказати, що за допомогою git fetch -fвиправили свою проблему! Дякую!
Крего

1
Це об'єднує віддалену гілку xzyв локальну гілку master, що не передбачається початковим запитанням; "Як я можу витягнути гілку xyz з GitHub і об'єднати її у гілку xyz на своєму localhost?"
користувач5359531

301

Просто чітко відслідковуйте свої віддалені гілки, і простий git pullвиконає все, що завгодно:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Останнє - це локальна операція.

Або ще більше вписується в документацію GitHub щодо розщеплення :

git branch -f new_local_branch_name upstream/remote_branch_name

39
Якщо ви отримали "Неправильне ім'я об'єкта:" origin / remote_branch_name ", спочатку зробіть" git fetch origin ".
Мартін Конічек

130

Ви можете витягнути гілку до гілки за допомогою наступних команд.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Коли ви перебуваєте на головній гілці, ви також могли спочатку оформити осередок, наприклад:

git checkout -b xyz

Це створює нову гілку, "xyz", від ведучого і безпосередньо перевіряє її.

Тоді ви робите:

git pull origin xyz

Це притягне нову гілку до вашої місцевої xyzфілії.


1
Ідеально! Я просто не знав цього синтаксису: git pull {repo} {remotebranchname}: {localbranchname}. Питання: якщо ця функція не працює (можливо, хтось оновив гілку, і виникнуть конфлікти), які мої варіанти?
Коста

7
Я знімаю це за те, що він намагається об'єднати віддалену гілку з вашою поточною гілкою (наприклад, головним). Більшість людей це не хочуть робити, і це не те, про що просила ОП. Відповідь @mohit - правильний вибір.
Фрогз

1
Фрогз - схоже, що така поведінка змінилася в останніх версіях Git. Я використовував це раніше, і це спрацювало чудово.
Pawan

88

Найкращий спосіб:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
Створивши нову гілку "dev" на github і спробувавши вище, я отримав таке повідомлення про помилку: "fatal: origin / dev не є комітом, і гілка 'dev' не може бути створена з неї" Рішення було "git вийміть "за рішенням Бредлі Флуда внизу, а потім повторно виконайте відповідь мохіта.
TomEberhard

46

git fetch захопить останній список галузей.

Тепер ти можеш git checkout MyNewBranch

Готово :)


Для отримання додаткової інформації див. Документи: git fetch


37

Я не впевнений, що повністю розумію проблему, але витягнути існуючу гілку робиться так (принаймні, це працює для мене :)

git pull origin BRANCH

Це передбачає, що ваша локальна філія створена за межами походження / BRANCH.



8

Простіше кажучи, Якщо ви хочете витягнути з GitHub гілку the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

Зазвичай, якщо для вашого коду призначено лише репо, тоді ім'я gitreponame буде походженням.

Якщо ви працюєте над двома репо, як одна локальна, а інша для віддаленої, як-от ви можете перевірити список репо від git remote -v . це показує, скільки репо присвоєно вашому поточному коду.

BranchName має існувати у відповідному gitreponame.

Ви можете використовувати наступні дві команди, щоб додати або видалити репо-файли

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

ви також можете зробити

git pull -r origin master

виправити конфлікти злиття, якщо такі є

git rebase --continue

-r призначений для відновлення. Це зробить вам структуру відділення

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

до

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Це призведе до більш чистої історії. Примітка. Якщо ви вже підштовхнули свою іншу гілку до походження (або будь-який інший віддалений), можливо, вам доведеться змусити натиснути свою гілку після відновлення.

git push -f origin other-branch

1

я зробив

git branch -f new_local_branch_name origin/remote_branch_name

Замість

git branch -f new_local_branch_name upstream/remote_branch_name

Як запропонував @innaM. Коли я використовував версію upstream, він сказав: "fatal: Недійсне ім'я об'єкта: 'upstream / remote_branch_name' '. Я не робив це git fetch originяк запропонований коментар, а натомість просто замінив upstreamна origin. Я думаю, вони рівноцінні.


0

для витягування гілки з GitHub ви можете використовувати

git checkout --track origin/the-branch-name

Переконайтесь, що назва гілки точно однакова.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.