Github: Імпортуйте гілку вгору за течією


169

У мене вилка ( origin) від проекту ( upstream) на github. Тепер проект вище за течією додав нову гілку, я хочу імпортувати у свою вилку. Як це зробити?

Я спробував перевірити віддалений та створити гілку поверх цього, але це налаштовує гілку так, як git pushвона намагається просунути до upstream:

git checkout upstream/branch
git checkout -b branch

редагувати

Можливо, це було не зрозуміло, але я хочу додати гілку до свого локального сховища, тому я можу натиснути її на origin(мою вилку) через git push. Оскільки сховища вгору за течією, як правило, лише для читання, і ви маєте надіслати їх внести внесок.

Тому я в основному хочу перевірити неіснуючу гілку origin, вміст якої буде виведено звідти upstream.

Відповіді:


262
  1. Переконайтеся, що ви перетягнули нову гілку вище за течією у місцеве репо :

    • По-перше, переконайтесь, що ваше робоче дерево чисте (виконайте / приховайте / скасуйте будь-які зміни)
    • Потім, git fetch upstreamщоб отримати нову гілку вище за течією
  2. Створіть та перейдіть на локальну версію нової гілки вище за течією ( newbranch):

    • git checkout -b newbranch upstream/newbranch
  3. Коли ви будете готові підштовхнути нову гілку до походження :

    • git push -u origin newbranch

У -u встановлює перемикач вгору відстеження зазначеної віддаленої (в даному прикладі, origin)


6
Я вважаю git fetch upstream, що на першому кроці є кращим варіантом, оскільки git pull upstreamпотрібно зробити більше дій після git remote add ...введення upstream.
Олександр Павлов

git pull upstream return: You asked to pull from the remote 'upstream', but did not specify a branch. Because this is not the default configured remote for your current branch, you must specify a branch on the command line.Додавання назви гілки в кінці команди викликає злиття між гілкою у висхідному потоці з поточною локальною гілкою замість того, щоб дозволити створення нової локальної гілки. Будь-які ідеї?
mMontu

1
Заміна git pull upstreamна git fetch upstreamвирішену проблему, і виконані наступні кроки.
mMontu

Я отримую: fatal: Не вдається оновити контури та перейти на гілку 'upstream' одночасно. Ви мали намір перевірити "upstream / master", який не може бути вирішений як фіксація?
sureshvv

1
@sureshvv Це, ймовірно , тому , що ви повинні мати віддалену посилання на висхідному сховище під назвою вгору по течії , перш ніж робити які - або з цього. Якщо ви цього не зробите, саме так ви додасте: git remote add upstream your_git_upstream_repository_url.git . Прочитайте це, якщо вам потрібні роз'яснення з цього приводу.
Габріель Рейнха

7

Я б користувався

git checkout -b <new_branch> upstream/<new_branch>

Це власне те, що я спробував ще до того, що я пояснив у питанні; це призводить до однакових результатів.
ткнути

4

У мене теж було проблеми з цим, і google взяв мене сюди. Однак рішення не спрацювали. Моя проблема полягала в тому, що коли я додав свій потік, він налаштував мій конфігурацію git тільки для отримання майстра, а не для всіх гілок. Наприклад, це виглядало так

[remote "somebody"]
        url = git@github.com:somebodys/repo.git
        fetch = +refs/heads/master:refs/remotes/upstream/master

Редагування .git / config наступним чином вирішило мою проблему

[remote "somebody"]
        url = git@github.com:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*

1

Наступні кроки для мене добре працювали (якщо вважати ім'я гілки вище за течією branch):

$ git fetch upstream
$ git checkout branch
$ git push origin

1
Я отримую git fetch upstream fatal: 'upstream' не видається фатальним сховищем git: Не вдалося прочитати з віддаленого сховища. Переконайтеся, що у вас є правильні права доступу та сховище існує.
ThinkDigital

0

--track?

git branch --track branch upstream/branch

Можливо, я вас зрозумів неправильно, але так ви і налаштуєте гілку так само; з pushпідштовхуванням до upstream.
ткнути

Ні, я думаю, що я неправильно тебе зрозумів.
troelskn

0

У мене був дещо складніший сценарій, коли я вже мав upstreamвизначене у своєму вилку (з канонічного репо), але мені потрібно було перевірити відділення з іншого вила. Щоб зробити це, процес дещо інший. Ось конфігурація, з якою я закінчив:

[remote "origin"]
url = git@github.com:<your_user/org>/<repo>.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
[remote "upstream"]
url = git@github.com:<upstream_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[remote "other_user"]
url = git@github.com:<other_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/<other_user>/*

Тепер ви також можете оформити відділення з <other_user>вилки.

git fetch <other_user> <branch>
git checkout -b <branch> <other_user>/<branch>

Це дасть вам локальну гілку, яка походить від вилки.

Щоб натиснути на цю локальну гілку, я повинен був бути конкретним з моєю командою push.

git push origin <branch>

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