Niedawno rozwidliłem projekt i zastosowałem kilka poprawek. Następnie utworzyłem żądanie ściągnięcia, które zostało następnie zaakceptowane.
Kilka dni później inny użytkownik wprowadził kolejną zmianę. Więc mój widelec nie zawiera tej zmiany.
Jak mogę wprowadzić tę zmianę do mojego widelca? Czy muszę usunąć i ponownie utworzyć widelec, gdy będę miał dalsze zmiany, aby wnieść swój wkład? Czy jest przycisk aktualizacji?
git
github
pull-request
git-fork
Lea Hayes
źródło
źródło
Odpowiedzi:
W lokalnym klonie swojego rozwidlonego repozytorium możesz dodać oryginalne repozytorium GitHub jako „zdalne”. („Piloty” są jak pseudonimy dla adresów URL repozytoriów -
origin
na przykład jest jeden.) Następnie możesz pobrać wszystkie gałęzie z tego repozytorium nadrzędnego i zmienić podstawę pracy, aby kontynuować pracę nad wersją nadrzędną. Pod względem poleceń, które mogą wyglądać:Jeśli nie chcesz przepisać historii swojej gałęzi master (na przykład ponieważ inne osoby mogły ją sklonować), powinieneś zastąpić ostatnią komendę
git merge upstream/master
. Aby jednak wysyłać kolejne żądania ściągania, które są tak czyste, jak to możliwe, prawdopodobnie lepiej jest zmienić bazę.Jeśli dokonałeś zmiany bazy na gałąź
upstream/master
, może być konieczne wymuszenie wypychania w celu wypchnięcia go do własnego rozwidlonego repozytorium na GitHub. Zrobiłbyś to z:Musisz użyć tylko
-f
za pierwszym razem po dokonaniu zmiany.źródło
-f
której popsuje się wszystkich, którzy mogliby sklonować twoją wersję.git merge --no-ff upstream/master
ten sposób twoje zatwierdzenia nie są już na topie.Od maja 2014 r. Można aktualizować widelec bezpośrednio z GitHub. To nadal działa od września 2017 r., ALE doprowadzi do brudnej historii zatwierdzeń.
Update from original
.).Teraz masz trzy opcje, ale każda z nich doprowadzi do niezbyt czystej historii zatwierdzeń.
This branch is X commits ahead, Y commits behind <original fork>
.Tak, możesz aktualizować swoje repozytorium przy użyciu upstream przy użyciu internetowego interfejsu GitHub, ale zrobienie tego popsunie twoją historię zatwierdzania. Kij do wiersza poleceń zamiast - to proste.
źródło
Oto oficjalny dokument GitHub dotyczący synchronizacji wideł :
źródło
git push origin master
--follow-tags
: stackoverflow.com/a/26438076/667847git merge upstream/master
, a następnie sprawdzić, aby rozwinąć oddział i zrobićgit merge upstream/develop
Permission denied (publickey). fatal: Could not read from remote repository.
gdy próbowałem pobrać z konta Facebook Github powyżej.Wiele odpowiedzi kończy się przesunięciem widelca o jeden zatwierdzenie przed repozytorium nadrzędnym. Ta odpowiedź zawiera podsumowanie kroków tutaj, które przeniosą widelec do tego samego zatwierdzenia, co rodzic .
Zmień katalog na lokalne repozytorium.
git checkout master
Dodaj element nadrzędny jako zdalne repozytorium,
git remote add upstream <repo-location>
git fetch upstream
Kwestia
git rebase upstream/master
git status
Kwestia
git push origin master
Aby uzyskać więcej informacji na temat tych poleceń, patrz krok 3 .
źródło
Przedmowa: Twój rozwidlenie jest „początkiem”, a repozytorium, z którego rozwidlasz się, to „upstream”.
Załóżmy, że sklonowałeś już swój widelec na swój komputer za pomocą następującego polecenia:
Jeśli tak jest, musisz kontynuować w następującej kolejności:
Dodaj „upstream” do sklonowanego repozytorium („origin”):
Pobierz commits (i gałęzie) z „upstream”:
Przejdź do gałęzi „master” widelca („origin”):
Ukryj zmiany w gałęzi „master”:
Scal zmiany z gałęzi „master” „upstream” do swojej „master” gałęzi „origin”:
Rozwiąż ewentualne konflikty scalania i zatwierdź połączenie
Wciśnij zmiany do swojego widelca
Odzyskaj swoje ukryte zmiany (jeśli istnieją)
Jesteś skończony! Gratulacje!
GitHub udostępnia także instrukcje dotyczące tego tematu: Synchronizowanie rozwidlenia
źródło
git remote add upstream [email protected]:original_author/project_name.git
tylko aliasgit remote add upstream https://github.com/original_author/project_name.git
?git stash
igit stash pop
część bardzo pomocnaJeśli, podobnie jak ja, nigdy nie zobowiązujesz się bezpośrednio do opanowania , co naprawdę powinieneś, możesz wykonać następujące czynności.
Z lokalnego klonu widelca utwórz pilota zdalnego sterowania. Musisz to zrobić tylko raz:
Następnie za każdym razem, gdy chcesz dogonić nadrzędną gałąź nadrzędną repozytorium, musisz:
Zakładając, że nigdy nie popełniłeś niczego samodzielnie, powinieneś już to zrobić. Teraz możesz popchnąć lokalnego mistrza do swojego oryginalnego widelca GitHub. Możesz również dokonać zmiany podstawy rozwoju na swoim aktualnym lokalnym komputerze głównym.
Po początkowej konfiguracji pobierania danych i sprawdzaniu danych głównych należy jedynie uruchomić następującą komendę, aby zsynchronizować dane główne z danymi wyjściowymi: git pull upstream master .
źródło
Od listopada 2013 r. W GitHub otwarto nieoficjalne żądanie funkcji z prośbą o dodanie bardzo prostej i intuicyjnej metody synchronizacji lokalnego rozwidlenia z nadrzędnym:
https://github.com/isaacs/github/issues/121
Uwaga: Ponieważ żądanie funkcji jest nieoficjalne, zaleca się również kontakt,
[email protected]
aby dodać wsparcie dla takiej funkcji, która ma zostać zaimplementowana. Powyższe nieoficjalne żądanie funkcji może być wykorzystane jako dowód na zainteresowanie związane z tym wdrożeniem.źródło
Na dzień tej odpowiedzi GitHub nie ma ( a może powinienem już nie mówić? ) Tej funkcji w interfejsie internetowym. Możesz jednak poprosić
[email protected]
o dodanie swojego głosu.W międzyczasie użytkownik GitHub, bardiharborow, stworzył narzędzie do wykonania tego: https://upriver.github.io/
Źródło jest tutaj: https://github.com/upriver/upriver.github.io
źródło
Jeśli korzystasz z GitHub na Windows lub Mac, teraz mają funkcję jednego kliknięcia, aby zaktualizować widelce:
źródło
W rzeczywistości możliwe jest utworzenie rozgałęzienia w rozwidleniu z dowolnego zatwierdzenia pobierania w przeglądarce:
https://github.com/<repo>/commits/<hash>
, gdzie repo to Twój widelec, a skrót to pełny skrót zatwierdzenia, który można znaleźć w interfejsie sieciowym. Na przykład mogę otworzyć https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 , co wskazuje nalinux
master
czas pisania.Następnie możesz pobrać tę gałąź do lokalnego klonu i nie będziesz musiał przesyłać wszystkich tych danych z powrotem do GitHub, gdy wypychasz zmiany na szczycie tego zatwierdzenia. Lub użyj interfejsu internetowego, aby zmienić coś w tej gałęzi.
Jak to działa (zgaduję, nie wiem, jak dokładnie to robi GitHub): widelce współużytkują pamięć obiektów i używają przestrzeni nazw do oddzielania odniesień użytkowników. Dzięki temu możesz uzyskać dostęp do wszystkich zatwierdzeń przez widelec, nawet jeśli nie istniały one do czasu rozwidlenia.
źródło
Wykonaj poniższe kroki. Próbowałem ich i to mi pomogło.
Kasa do oddziału
Pobierz gałąź repozytorium źródłowego, aby uzyskać najnowszy kod
źródło
git push HttpsForYourForkOfTheRepo BRANCH_NAME
Aktualizuję moje rozwidlone repo za pomocą tej jednej linii:
Użyj tego, jeśli nie chcesz dodawać kolejnego zdalnego punktu końcowego do swojego projektu, ponieważ zamieszczono tutaj inne rozwiązania.
źródło
pull
.Jako uzupełnienie tej odpowiedzi szukałem sposobu na zaktualizowanie wszystkich zdalnych gałęzi mojego sklonowanego repo ( origin ) z gałęzi upstream za jednym razem. Tak to zrobiłem.
Zakłada się, że skonfigurowałeś już zdalne skierowanie w górę do repozytorium źródłowego (skąd pochodzi źródło ) i zsynchronizowałeś go
git fetch upstream
.Następnie uruchomić:
Pierwsza część tego polecenia zawiera listę wszystkich głowic w zdalnym repozytorium nadrzędnym i usuwa SHA-1, a następnie
refs/heads/
prefiks nazwy gałęzi.Następnie dla każdej z tych gałęzi wypycha lokalną kopię wcześniejszej zdalnej gałęzi śledzenia (
refs/remotes/upstream/<branch>
po stronie lokalnej) bezpośrednio do zdalnej gałęzi na początku (refs/heads/<branch>
po stronie zdalnej).Każde z tych poleceń synchronizacji gałęzi może się nie powieść z jednego z dwóch powodów: albo gałąź nadrzędna została przepisana, albo wypychasz zatwierdzenia z tej gałęzi do swojego widelca. W pierwszym przypadku, w którym nic nie przypisałeś gałęzi widelca, możesz bezpiecznie naciskać mocno (dodaj przełącznik -f , tj.
git push -f
W powyższym poleceniu). W drugim przypadku jest to normalne, ponieważ rozgałęzienie rozgałęzienia się rozdzieliło i nie można oczekiwać, że polecenie synchronizacji zadziała, dopóki zatwierdzenia nie zostaną ponownie połączone w górę .źródło
Aplikacja „Pull” to rozwiązanie do automatycznej konfiguracji i zapomnienia. Zsynchronizuje domyślną gałąź twojego widelca z repozytorium nadrzędnym.
Odwiedź adres URL, kliknij zielony przycisk „Zainstaluj” i wybierz repozytoria, w których chcesz włączyć automatyczną synchronizację.
Oddział jest aktualizowany raz na godzinę bezpośrednio na GitHub, na komputerze lokalnym musisz pobrać oddział główny, aby upewnić się, że twoja kopia lokalna jest zsynchronizowana.
źródło
mergemethod
. Więcej na ten temat tutajAndroid Studio nauczył się teraz obsługi repozytoriów widełek GitHub (nie musisz nawet dodawać zdalnego repozytorium za pomocą polecenia konsoli).
Otwórz menu VCS → Git
I zwróć uwagę na dwa ostatnie elementy menu podręcznego:
Zrestartuj mój widelec GitHub
Utwórz żądanie ściągnięcia
Spróbuj ich. Pierwszego używam do synchronizacji mojego lokalnego repozytorium. W każdym razie gałęzie z nadrzędnego zdalnego repozytorium („upstream”) będą dostępne w Android Studio po kliknięciu „Rebase my GitHub fork” i będziesz mógł z nimi łatwo operować.
(Używam Androida Studio 3.0 z wtyczkami „Git Integration” i „GitHub”).
źródło
Po sklonowaniu rozwidlonego repozytorium przejdź do ścieżki katalogu, w której znajduje się klon, i kilku wierszy w terminalu Git Bash.
I dobrze, że możesz iść. Wszystkie zaktualizowane zmiany w głównym repozytorium zostaną wprowadzone do repozytorium wideł.
Komenda „fetch” jest niezbędna do zachowania aktualności w projekcie: tylko podczas wykonywania „git fetch” będziesz informowany o zmianach, które twoi koledzy wypchnęli na zdalny serwer.
Nadal możesz odwiedzić tutaj, aby uzyskać dalsze zapytania
źródło
Jeśli ustawisz swój upstream. Sprawdź za pomocą
git remote -v
, to wystarczy.źródło
Zależy to od wielkości repozytorium i sposobu jego rozwidlenia.
Jeśli jest to dość duże repozytorium, być może chciałbyś nim zarządzać w specjalny sposób (np. Historia upuszczania). Zasadniczo można uzyskać różnice między bieżącą a wcześniejszą wersją, zatwierdzić je, a następnie wybrać ponownie do opanowania.
Spróbuj przeczytać ten . Opisuje, jak obsługiwać duże repozytoria Git i jak je przesyłać za pomocą najnowszych zmian.
źródło
Chciałbym dodać do użytkownika @ krlmlr odpowiedź .
Początkowo rozwidlony repozytorium jeden oddział o nazwie:
master
. Jeśli pracujesz nad nową funkcją lub poprawką, zazwyczaj tworzysz nowy oddziałfeature
i wprowadzasz zmiany.Jeśli chcesz, aby rozwidlone repozytorium było zsynchronizowane z repozytorium nadrzędnym, możesz skonfigurować plik konfiguracyjny (
pull.yml
) dla aplikacji Pull ( w gałęzi funkcji ) w następujący sposób:Dzięki temu
master
gałąź rozwidlonego repozytorium jest na bieżąco z repozytorium nadrzędnym. Utrzymujefeature
gałąź rozwidlonego repo aktualizowaną poprzezmaster
gałąź rozwidlonego repo, łącząc to samo. Zakłada się, żefeature
gałąź jest gałąź domyślną, która zawiera plik konfiguracyjny.Oto dwie z
mergemethods
nich, jednahardreset
pomaga wymuszać synchronizację zmian wmaster
gałęzi rozwidlonego repozytorium z repozytorium nadrzędnym, a druga metodamerge
. Ta metoda służy do scalania zmian dokonanych przez Ciebie wfeature
oddziale i zmian dokonanych z powodu wymuszenia synchronizacji wmaster
oddziale. W przypadku konfliktu scalenia aplikacja pull pozwoli ci wybrać następny kierunek działania podczas żądania pull.Możesz przeczytać o podstawowych i zaawansowanych konfiguracjach i różnych
mergemethods
tutaj .Obecnie używam tej konfiguracji w moim rozwidlonym repozytorium tutaj, aby mieć pewność, że wymagane tutaj ulepszenie pozostanie aktualne.
źródło
Utrzymywanie rozwidlonego repozytorium zawsze wymaga aktualizacji na dwa sposoby.
Więc kiedy twoje żądanie ściągnięcia zostanie zaakceptowane, możesz bezpiecznie usunąć gałąź, ponieważ Twój przekazany kod będzie wtedy dostępny w twoim głównym repozytorium w wersji rozwidlonej, gdy zaktualizujesz go za pomocą upstream. Dzięki temu twój mistrz będzie zawsze w czystym stanie, aby utworzyć nowy oddział, aby dokonać kolejnej zmiany.
Można to zrobić za pomocą crona . Oto przykładowy kod, jeśli robisz to w systemie Linux.
umieść ten kod,
crontab file
aby wykonać zadanie co godzinę.następnie utwórz
cron.sh
plik skryptu i interakcję git z ssh-agent i / lub oczekuj, jak poniżejSprawdź swoje rozwidlone repozytorium. Od czasu do czasu zawsze wyświetla to powiadomienie:
źródło
Użyj tych poleceń (na szczęście)
źródło