Github: Importuj gałąź upstream do fork

169

Mam widelec ( origin) z projektu ( upstream) na github. Teraz projekt nadrzędny dodał nową gałąź, którą chcę zaimportować do mojego forka. W jaki sposób mogę to zrobić?

Próbowałem sprawdzić pilota i utworzyć gałąź na szczycie, ale to konfiguruje gałąź w sposób, w jaki git pushpróbuje się wypchnąć do upstream:

git checkout upstream/branch
git checkout -b branch

edytować

Być może nie było to jasne, ale chcę dodać gałąź do mojego lokalnego repozytorium, aby móc przesłać ją do origin(mojego forka) za pośrednictwem git push. Ponieważ repozytoria nadrzędne są zwykle tylko do odczytu i należy je rozwidlać, aby wnieść swój wkład.

Więc w zasadzie chcę wyewidencjonować nieistniejącą gałąź, z originktórej zawartość zostanie pobrana upstream.

szturchać
źródło

Odpowiedzi:

262
  1. Upewnij się, że ściągnąłeś nową gałąź upstream do lokalnego repozytorium :

    • Po pierwsze, upewnij się , że twoje drzewo robocze jest czyste (zatwierdź / ukryj / cofnij wszelkie zmiany)
    • Następnie, git fetch upstreamaby pobrać nową gałąź upstream
  2. Utwórz i przełącz się na lokalną wersję nowej gałęzi upstream ( newbranch):

    • git checkout -b newbranch upstream/newbranch
  3. Kiedy będziesz gotowy, aby wypchnąć nową gałąź do początku :

    • git push -u origin newbranch

W -u zestawy przełączników śledzenia na określony zdalnego (w tym przykładzie origin)

urschrei
źródło
6
Uważam, że git fetch upstreamjest to lepsza opcja na pierwszym etapie, ponieważ git pull upstreamwymaga wykonania większej liczby czynności git remote add ...dla upstream.
Alexander Pavlov
git pull upstream Returns: 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.Dodanie nazwy gałęzi na końcu polecenia powoduje scalenie gałęzi w górę z bieżącą gałęzią lokalną zamiast pozwolić na utworzenie nowej gałęzi lokalnej. Jakieś pomysły?
mMontu
1
Wymiana git pull upstreamz git fetch upstreamrozwiązał problem, a następujące kroki pracował.
mMontu
Otrzymuję: fatal: Nie można jednocześnie aktualizować ścieżek i przełączać się na gałąź „upstream”. Czy zamierzałeś wyewidencjonować „upstream / master”, którego nie można rozwiązać jako zatwierdzenie?
sureshvv
1
@sureshvv Jest to prawdopodobnie spowodowane tym, że przed zrobieniem czegokolwiek musisz mieć zdalne odwołanie do repozytorium nadrzędnego o nazwie upstream . Jeśli tego nie zrobisz, w ten sposób możesz to dodać: git remote add upstream your_git_upstream_repository_url.git . Przeczytaj to, jeśli potrzebujesz wyjaśnień w tej sprawie.
Gabriel Rainha
7

użyłbym

git checkout -b <new_branch> upstream/<new_branch>
Svenito
źródło
Właśnie tego próbowałem jeszcze przed tym, co wyjaśniłem w pytaniu; prowadzi do tych samych rezultatów.
poke
4

Ja też miałem z tym problem i Google zabrał mnie tutaj. Rozwiązania jednak nie zadziałały. Mój problem polegał na tym, że kiedy dodałem mój upstream, skonfigurowałem moją konfigurację git tak, aby pobierała tylko master, a nie wszystkie gałęzie. np. tak to wyglądało

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

Edycja pliku .git / config w następujący sposób rozwiązała mój problem

[remote "somebody"]
        url = [email protected]:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*
Ian Will
źródło
1

Poniższe kroki zadziałały dobrze (zakładając, że nazwa gałęzi upstream to branch):

$ git fetch upstream
$ git checkout branch
$ git push origin
Eneko Alonso
źródło
1
Otrzymuję git fetch upstream fatal: „upstream” nie wydaje się być krytycznym repozytorium git: nie można odczytać ze zdalnego repozytorium. Upewnij się, że masz odpowiednie prawa dostępu i że repozytorium istnieje.
ThinkDigital,
0

--track?

git branch --track branch upstream/branch
troelskn
źródło
Może źle cię zrozumiałem, ale zrobienie tego spowoduje utworzenie oddziału w ten sam sposób; z pushpusing do upstream.
poke
Nie, myślę, że cię źle zrozumiałem.
troelskn
0

Miałem nieco bardziej skomplikowany scenariusz, w którym miałem już upstreamzdefiniowany w moim forku (z repozytorium kanonicznego), ale musiałem pobrać gałąź z innego forka. Aby to zrobić, proces jest nieco inny. Oto konfiguracja, z którą skończyłem:

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

Teraz możesz również pobrać gałąź z <other_user>widelca.

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

To da ci lokalną gałąź, która pochodzi z rozwidlenia.

Aby wypchnąć tę lokalną gałąź, musiałem być konkretny w moim poleceniu push.

git push origin <branch>
okor
źródło
To prawie to samo, co zaakceptowana odpowiedź, tyle że pilot, z którego pobierasz, nie jest nazywany „upstream”.
poke