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.

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)


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>

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 = git@github.com: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 = git@github.com:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*

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

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

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 = 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>/*

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>

To prawie to samo, co zaakceptowana odpowiedź, tyle że pilot, z którego pobierasz, nie jest nazywany „upstream”.
poke
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.