Github: импорт ветки вверх по течению в fork


169

У меня есть fork ( origin) из проекта ( upstream) на GitHub. Теперь вышестоящий проект добавил новую ветку, которую я хочу импортировать в свой форк. Как я могу это сделать?

Я попытался проверить удаленный и создать ветку поверх этого, но это настраивает ветку так, как git pushона пытается подтолкнуть к upstream:

git checkout upstream/branch
git checkout -b branch

редактировать

Может быть, это не было ясно, но я хочу добавить ветку в свой локальный репозиторий, чтобы я мог передать его origin(мой форк) через git push. Потому что репозитории верхнего уровня обычно доступны только для чтения, и вы делаете это, чтобы внести свой вклад.

Поэтому я в основном хочу originоформить несуществующую ветку , содержимое которой будет извлечено из upstream.

Ответы:


262
  1. Убедитесь, что вы добавили новую ветку upstream в локальный репозиторий :

    • Во-первых, убедитесь, что ваше рабочее дерево чистое (зафиксировать / спрятать / отменить любые изменения)
    • Затем, git fetch upstreamчтобы получить новую ветку
  2. Создайте и переключитесь на локальную версию новой ветки upstream ( 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 возвращает: 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 Это, вероятно, потому, что вам нужно иметь удаленную ссылку на вышестоящий репозиторий с именем upstream, прежде чем делать что-либо из этого. Если вы этого не сделаете, вот как вы добавите один: git remote add upstream your_git_upstream_repository_url.git . Прочтите это, если вам нужно разъяснение по этому вопросу.
Габриэль Райнха

7

я хотел бы использовать

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

Это на самом деле то, что я пытался еще до того, что я объяснил в вопросе; это приводит к тем же результатам.
ткни

4

У меня тоже были проблемы с этим, и Google взял меня сюда. Решения не сработали. Моя проблема заключалась в том, что когда я добавил свой апстрим, он настроил мой git config только на выборку master, а не на все ветви. например, это выглядело так

[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.