Jestem początkującym Gitem. Niedawno przeniosłem projekt Rails z Subversion do Git. Wykonałem samouczek tutaj: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/
Używam też unfuddle.com do przechowywania mojego kodu. Wprowadzam zmiany na moim laptopie Mac w pociągu do / z pracy, a następnie popycham je, aby się rozłączyły, gdy mam połączenie sieciowe, używając następującego polecenia:
git push unfuddle master
Używam Capistrano do wdrożeń i ściągam kod z repozytorium rozwijanego za pomocą gałęzi master.
Ostatnio zauważyłem następujący komunikat, gdy uruchamiam „git status” na moim laptopie:
# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)
I jestem zdezorientowany, dlaczego. Myślałem, że mój laptop jest źródłem ... ale nie wiem, czy to fakt, że pierwotnie wycofałem się z Subversion lub nacisnąłem Unfuddle, jest przyczyną tego, że komunikat się pojawia. Jak mogę:
- Dowiedz się, gdzie Git uważa, że jest „pochodzenie / mistrz”?
- Jeśli jest gdzie indziej, jak mogę zmienić laptopa w „origin / master”?
- Dostań tę wiadomość, aby odejść. To sprawia, że myślę, że Git jest z czegoś niezadowolony.
Na moim komputerze Mac działa Git w wersji 1.6.0.1.
Po uruchomieniu git remote show origin
zgodnie z sugestią dbr otrzymuję następujące informacje:
~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly
Kiedy uruchamiam git remote -v
zgodnie z sugestią Aristotle Pagaltzis, otrzymuję następujące informacje:
~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin /Users/brian/Projects/GeekFor/gf/.git
unfuddle [email protected]:spilth/geekfor.git
Co ciekawe, pracuję nad moim projektem w geekfor
katalogu, ale mówi, że moje pochodzenie to moja lokalna maszyna w gf
katalogu. gf
Wydaje mi się, że był to katalog tymczasowy, którego użyłem podczas konwersji mojego projektu z Subversion na Git i prawdopodobnie tam, gdzie naciskałem, aby się rozwinąć. Potem wydaje mi się, że sprawdziłem świeżą kopię z rozwijanej do geekfor
katalogu.
Wygląda na to, że powinienem postępować zgodnie z radą dbr i zrobić:
git remote rm origin
git remote add origin [email protected]:spilth/geekfor.git
źródło
origin
repozytorium (chociaż nie jest świadomy tego, jak to działa w kategoriach git) - usunięcie pilota nie byłoby dla niego zbyt przydatne.Przyszedłem do tego pytania, szukając wyjaśnienia na temat tego, co oznacza komunikat „Twoja gałąź jest przed ...” w ogólnym schemacie git. Tutaj nie było odpowiedzi, ale ponieważ to pytanie pojawia się obecnie w górnej części Google, gdy szukasz frazy „Twoja gałąź wyprzedza„ origin / master ””, i od tego czasu zrozumiałem, co tak naprawdę oznacza wiadomość , Myślałem, że opublikuję informacje tutaj.
Będąc początkującym nowicjuszem, widzę, że odpowiedź, której potrzebowałem, była wyraźnie nowicjuszem. W szczególności to, co oznacza „twoja gałąź jest o…” oznacza, że istnieją pliki dodane i zapisane w lokalnym repozytorium, ale nigdy nie wypychane do źródła. Zamysł tego przesłania jest dodatkowo zaciemniony przez fakt, że „git diff”, przynajmniej dla mnie, nie wykazał żadnych różnic. Dopiero po uruchomieniu „git diff origin / master” powiedziano mi, że istnieją różnice między moim lokalnym repozytorium a zdalnym master.
Tak więc, dla jasności:
„Twoja gałąź jest przed ...” => Musisz pchnąć do zdalnego mistrza. Uruchom „git diff origin / master”, aby zobaczyć, jakie są różnice między lokalnym repozytorium a zdalnym repozytorium głównym.
Mam nadzieję, że pomoże to innym początkującym.
(Rozumiem również, że istnieją subtelności konfiguracji, które mogą częściowo unieważnić to rozwiązanie, takie jak fakt, że wzorzec może nie być w rzeczywistości „zdalny”, a „pochodzenie” jest rekonfigurowalną nazwą używaną przez konwencję itp. Ale początkujący nie dbamy o tego rodzaju rzeczy. Chcemy prostych, prostych odpowiedzi. O subtelnościach możemy przeczytać później, gdy rozwiążemy palący problem).
Hrabia
źródło
git diff --cached origin/master
byłoby lepszej instrukcji tutaj, ponieważ określa ona, jaki byłby wynik następnego pushu? Podświetlone polecenie, które masz powyżej, pokazuje również nieprzypisane i nieustawione pliki (myślę, że jestem też początkującym)git fetch
jeśli pojawi się ten błąd pogit pull remote branch
. Twoje referencje mogą być nieaktualne.git fetch
naprawia to.origin/master
część oznaczamaster
oddział worigin
repo?# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
ale git diff origin / master nic nie pokazuje (a opcja --cached tego nie zmienia). I git fetch tego nie zmienia, git pull tego nie zmienia, git reset - twardy tego nie zmienia. Aby to zmienić, potrzebowałem: git reset --hard origin / master I wybrałem tę trasę, ponieważ inni ludzie pracują ze mną w tym repozytorium i nie chciałem unieważniać ich testowania, a ponieważ nie mogłem dowiedzieć się, co te zobowiązania są.git checkout master
dostanę wiadomość, co oznacza, że powinienemgit pull origin master
przed pracą. ale uważam to za bardzo mylące, ponieważ sformułowanie wiadomości sugerujeMiałem problem podobny do tego, w którym znajdował się mój katalog roboczy,
ahead of origin by X commits
alegit pull
wynikało z niegoEverything up-to-date
. Udało mi się to naprawić, postępując zgodnie z tą radą . Zamieszczam to tutaj na wypadek, gdyby pomogło to komuś innemu z podobnym problemem.Podstawowa poprawka jest następująca:
Gdzie słowa w nawiasach powinny być zastąpione nazwą zdalną, nazwą oddziału lokalnego i nazwą oddziału zdalnego. na przykład
źródło
git diff
nic nie pokazałem, a po zrobieniu tego, co opisałeś, nie mam już tego mylącego i irytującego przesłania.czasami istnieje różnica między lokalną wersją pamięci podręcznej źródła master (origin / master) i prawdziwym źródłem master.
Jeśli uruchomisz
git remote update
to ponownie zsynchronizujesz master źródłowy z origin / masterzobacz zaakceptowaną odpowiedź na to pytanie
Różnice między git pull origin master i git pull origin / master
źródło
To trochę nonsensowne:
origin
odnosi się do domyślnego zdalnego repozytorium - tego, z którego zwykle pobierasz / pobierasz zmiany innych osób.git remote -v
pokaże ci, coorigin
jest;origin/master
jest twoją „zakładką” dla ostatniego znanego stanumaster
oddziałuorigin
repozytorium, a twoją własnąmaster
jest gałąź śledzenia dlaorigin/master
. To wszystko tak, jak powinno być .Ty nie. Przynajmniej nie ma sensu, aby repozytorium było domyślnym repozytorium dla siebie.
To nie jest To tylko mówi ci, że dokonałeś tak wielu zatwierdzeń lokalnie, które nie znajdują się w zdalnym repozytorium (zgodnie z ostatnim znanym stanem tego repozytorium).
źródło
origin
lokalne wskazywanie na laptopa, ponieważ bycie offline lub przełączanie sieci to bardzo częsty przypadek urządzeń przenośnych takich jak laptopy. W ten sposób można wykorzystaćgit push
igit pull
za każdym razem, nie ma potrzeby, aby myśleć o tym, czy jesteś podłączony do właściwej sieci obecnie. Ten lokalnyorigin
można automatycznie zsynchronizować z prawdziwymi pilotami, gdy dostępne jest łącze sieciowe, w zależności od bieżącego stanu roamingu. Problematyczne jest to, kiedy uruchomić synchronizację, w porównaniu z tym, że część GIT jest dość łatwa.origin
w innym repozytorium na swoim laptopie sens, pewnie. Skierowanieorigin
repozytorium na siebie nie robi jednak: nie ma znaczenia, czy działasz, czygit push
teżgit pull
, ponieważ repozytorium i tak zawsze jest dokładnie zsynchronizowane ze sobą. To błahe, trochę tautologiczne.[ Rozwiązanie ]
^ to rozwiązało to dla mnie. To, co zrobiło, zsynchronizowało mojego mistrza (na laptopie) z „początkiem”, który jest na zdalnym serwerze.
źródło
Walczę z tym problemem i żadna z poprzednich odpowiedzi nie rozwiązuje pytania tak, jak je widzę. Usunęłam problem z powrotem do jego podstaw, aby sprawdzić, czy mogę wyjaśnić mój problem.
Tworzę nowe repozytorium (rep1), umieszczam w nim jeden plik i zatwierdzam go.
Tworzę klon rep1 i nazywam go rep2. Zaglądam do rep2 i widzę, że plik jest poprawny.
W rep1 dokonuję pojedynczej zmiany w pliku i zatwierdzam go. Następnie w rep1 tworzę pilota do wskazywania rep2 i wypycham zmiany.
Teraz, kiedy wchodzę w rep2 i robię status „git”, dostaję informację, że jestem przed początkiem.
Plik README w rep2 jest taki, jaki był pierwotnie przed drugim zatwierdzeniem. Jedyne modyfikacje, które wprowadziłem, to rep1 i wszystko, co chciałem zrobić, to wypchnąć je do rep2. Czego nie rozumiem?
źródło
Czeka na ciebie „push”. Próbować:
$ git push
źródło
Ostatnio miałem ten problem i pomyślałem, że to dlatego, że usunąłem niektóre pliki, których już nie potrzebowałem. Problem polega na tym, że git nie wie, że pliki zostały usunięte i widzi, że serwer nadal je ma. (serwer = pochodzenie)
Więc pobiegłem
A potem uruchomiłem zatwierdzenie i push.
To rozwiązało problem.
źródło
Jestem również początkującym. Miałem ten sam problem z komunikatami „Twój oddział wyprzedza źródło / master przez N zatwierdzeń”. Wykonanie sugerowanego „git diff origin / master” pokazało pewne różnice, których nie chciałem zachować. Więc ...
Ponieważ mój klon git był przeznaczony do hostingu, a ja chciałem dokładnej kopii głównego repozytorium i nie dbałem o żadne lokalne zmiany, postanowiłem zaoszczędzić całe moje repo i stworzyć nową:
(na maszynie hostingowej)
Ze względów praktycznych dokonywałem zmian w klonie na mojej maszynie hostingowej. Już nie. Wprowadzę te zmiany do mistrza, dokonam tam polecenia git i wykonam polecenie git. Mam nadzieję, że powinno to utrzymać mój klon git na maszynie hostingowej w pełnej synchronizacji.
/ Nara
źródło
Zastanawiałem się nad tym samym w moim repozytorium. W moim przypadku miałem starego pilota, do którego już nie naciskałem, więc musiałem go usunąć.
Uzyskaj listę pilotów:
Usuń ten, którego nie potrzebujesz
źródło
Możliwe jest zresetowanie do konkretnego zatwierdzenia przed dokonaniem własnych zatwierdzeń.
Służy
git log
do znajdowania zatwierdzenia, które miałeś przed wprowadzeniem lokalnych zmian.Zanotuj lokalne zatwierdzenia i zresetuj bezpośrednio do poprzedniego zatwierdzenia:
źródło
Miałem problem „Twoja gałąź wyprzedza„ origin / master ”przez nn commits.” po przekazaniu do zdalnego repozytorium za pomocą:
Kiedy odkryłem, że mój zdalny adres znajduje się w pliku .git / FETCH_HEAD i użyłem:
problem zniknął.
źródło