Jak wyczyścić widelec Github, aby móc wysyłać czyste żądania ściągnięcia?

83

Rozwidliłem repozytorium na Githubie. Dokonałem kilku drobnych zmian i przesłałem żądania ściągnięcia do głównego źródła, ale po drodze mój fork stał się tak zniekształcony, że nie mogę generować czystych żądań ściągnięcia; kiedy zaczynam żądanie ściągnięcia z gałęzi z sześcioma zmianami, Github chce przesłać trzynaście, z których siedem już istnieje (natch).

Wydaje się, że mój problem jest związany tylko z pobieraniem najnowszych zatwierdzeń , ale kiedy tworzę nową gałąź i najlepsze zatwierdzenia, nadal mam dodatki. Sfruzowałem również z rebasingiem , ale teraz wygląda na to, że nawet mój master jest tak pomieszany, że nie mogę wygenerować czystej kopii upstream . Najwyraźniej dzieje się tak, ponieważ nie rozumiałem, że muszę zmienić bazę zamiast scalać , więc najwyraźniej popełniłem błędy; to, co próbuję zrobić, to dowiedzieć się, jak rozwiązać ten węzeł i wrócić do czystego stanu, w którym mogę pożytecznie iść do przodu.

W pewnym sensie chcę zdmuchnąć swój widelec i zrobić nowy rozwidlenie górnego strumienia, ale myślę, że to też jest trudne.

Po wyznaniu grzechów w Git, jak uzyskać rozgrzeszenie na githubie?

pjmorse
źródło
1
Kochaj swoją spowiedź i prośbę o rozgrzeszenie :-)
Jon Kern
Co, są ludzie, dla których git nie jest religią? ;-)
pjmorse

Odpowiedzi:

102

Krok 1: Wyciągnij zmiany w górę
Zaleca się, aby dodać repozytorium nadrzędne jako „nadrzędne”, jak wyjaśniono na stronie Fork a Repo :

git pull --rebase upstream master

Ta --rebaseopcja umieszcza zmiany na najnowszym zatwierdzeniu bez scalania.

Krok 2: (Opcjonalnie) Połącz swoje zatwierdzenia w 1 zatwierdzenie

git reset --soft upstream/master

To polecenie „cofnie” wszystkie Twoje zatwierdzenia, ale nie zmieni plików. Możesz więc zatwierdzić wszystkie swoje zmiany w jednym zatwierdzeniu.

git commit -a

Krok 3: Sprawdź i przetestuj zmiany

Aby pokazać zmiany, użyj GUI, takiego jak wbudowany gitk, Sourcetree , TortoiseGit lub Tower (płatny) itp.

Krok 4: Naciśnij

git pushzgłosi błąd, ponieważ wypychanie zmieniłoby historię repozytorium docelowego.
Jeśli masz pewność, że zmiany pokazane w kroku 3 są poprawne, naciśnij przycisk „-f”

git push -f origin master


Informacje dodatkowe
Polecenie dodania pilota to:

git remote add upstream git://github.com/[username]/[project].git

Możesz także pobrać z bezpośredniego adresu URL:

git pull --rebase  git://github.com/[username]/[project].git

Ale wtedy będziesz potrzebować skrótu najnowszego zatwierdzenia typu upstream zamiast „upstream / master” w innych krokach.

Bob Fanger
źródło
3
Dziękuję Ci bardzo. GitHub powinien zaktualizować swoje Fork A Repo .
buschtoens
Dzięki! Próbowałem wielu sposobów rozwiązania tego problemu, nic nie działało. Był prawie gotowy, aby zdmuchnąć mój widelec, zanim znalazłem odpowiedź ... i zadziałało. Dzięki!
Judah Gabriel Himango
Cześć @JudahHimango. Czy wykonałeś również „krok 2”. Ponieważ jestem w takiej samej sytuacji jak ty. Możesz mi pomóc.
arunit21
To świetne źródło. Dzięki!
Dr Jan-Philip Gehrcke
Moje rozwidlone repozytorium powtarzało, że nie jest zsynchronizowane z wyższą wersją, więc ściągnęłam i połączyłam - co prowadziło do zatwierdzeń na moim forku, które nie były konieczne. Zastosowanie tego podejścia i wymuszenie pchnięcia rozwiązało problem. Użyłem również rebase, aby połączyć niektóre z moich wcześniejszych zatwierdzeń: git rebase -i HEAD ~ n [gdzie n to liczba zatwierdzeń]
The Coder,
4

Jak rozumiem, zarówno w przypadku Gita, jak i Mercuriala (używałem tylko tego drugiego, więc mogę się mylić) nie jest w ogóle wielka sprawa, aby zdmuchnąć fork i ponownie go rozwidlić. Robię to cały czas z moimi projektami. Jeśli nie przeszkadza Ci to (możesz wykonać kopię zapasową zmian lub nie masz żadnych znaczących zmian w swoim widelcu), powiedziałbym, że prawdopodobnie jest to właściwy sposób.

Pamiętaj, że w DVCS rozwidlenie repozytorium tworzy pełny klon całego repozytorium . Jeśli usuniesz swój obecny fork, a następnie ponownie rozwiniesz oryginalne repozytorium, będziesz mieć całkowicie czystą kartę do pracy.

Sean Edwards
źródło
Fork w tym przypadku jest specjalną cechą github, a nie core git, chociaż używa podstawowych funkcji git. Istnieją specjalne możliwości administracyjne github, które możesz wykonać za pomocą github-forks.
Seth Robertson
1
O, rozumiem. Używam głównie BitBucket i tam „Fork” jest synonimem „klonowania”, kiedy pracujesz z osobistymi kopiami roboczymi. Na wszelki wypadek zostawię tutaj swoją odpowiedź.
Sean Edwards
Tak, kilka razy usunąłem lokalny klon i sklonowałem go ponownie. Zrobiłem eksperyment z innym repozytorium i wygląda na to, że nie ma problemu z usunięciem widelca i utworzeniem nowego z tego samego źródła.
pjmorse
Uwaga: używam git format-patchnajpierw zatwierdzeń, które chcę zapisać.
pjmorse
1
Usunięcie rozwidlonego repozytorium i ponowne uruchomienie jest niepotrzebne, a używanie git format-patchdo zapisywania pracy jest czymś w rodzaju pomijania wszystkich przydatnych narzędzi, które git ma do zarządzania gałęziami. W przyszłości użycie git rebase -ido wybiórczego przepisywania zatwierdzeń na górze nowej mastergałęzi upstream jest właściwą rzeczą do zrobienia.
Mark Longair
0

W swoim prywatnym repozytorium dodaj repozytorium forkee jako pilot. Zrestartuj / zresetuj swoje oddziały z oddziałów pilota. Wypchnij na siłę do repozytorium na githubie.

Jeśli potrzebujesz dokładnych poleceń, daj mi znać. Daj mi również znać, czy chcesz spróbować zachować lokalne zatwierdzenia, czy też „zdmuchnięcie” jest w porządku.

Seth Robertson
źródło