Jak mogę znaleźć lokalizację git / master w git i jak ją zmienić?

227

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ę:

  1. Dowiedz się, gdzie Git uważa, że ​​jest „pochodzenie / mistrz”?
  2. Jeśli jest gdzie indziej, jak mogę zmienić laptopa w „origin / master”?
  3. 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 originzgodnie 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 -vzgodnie 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 geekforkatalogu, ale mówi, że moje pochodzenie to moja lokalna maszyna w gfkatalogu. gfWydaje 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 geekforkatalogu.

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
Brian Kelly
źródło

Odpowiedzi:

202

1. Dowiedz się, gdzie Git uważa, że ​​używa „origin / master” git-remote

git remote show origin

.. który zwróci coś takiego jak ...

* remote origin
  URL: [email protected]:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Pilot to w zasadzie link do zdalnego repozytorium. Kiedy to zrobisz ...

git remote add unfuddle [email protected]/myrepo.git
git push unfuddle

..git wypchnie zmiany na dodany adres. To jak zakładka do zdalnych repozytoriów.

Po uruchomieniu git statussprawdza, czy w pilocie brakuje zatwierdzeń (w porównaniu do lokalnego repozytorium), a jeśli tak, o ile zatwierdzeń. Jeśli wszystkie zmiany zostaną przekazane do „początku”, oba będą zsynchronizowane, więc nie otrzymasz tej wiadomości.

2. Jeśli jest gdzie indziej, jak mogę zmienić laptopa w „origin / master”?

Nie ma sensu tego robić. Powiedzmy, że „pochodzenie” zostało przemianowane na „laptop” - nigdy nie chcesz robić tego git push laptopze swojego laptopa.

Jeśli chcesz usunąć źródło pochodzenia, musisz ...

git remote rm origin

Nie spowoduje to usunięcia niczego (pod względem zawartości pliku / historii wersji). Spowoduje to zatrzymanie komunikatu „twoja gałąź wyprzedza…”, ponieważ nie będzie już porównywać twojego repozytorium ze zdalnym (ponieważ go nie ma!)

Należy pamiętać, że nie ma w tym nic specjalnego origin, to tylko domyślna nazwa, której używa git.

Git origindomyślnie używa , gdy robisz rzeczy takie jak git pushlub git pull. Tak więc, jeśli masz pilota, którego często używasz (w twoim przypadku Unfuddle), polecam dodanie unfuddle jako „origin”:

git remote rm origin
git remote add origin [email protected]:subdomain/abbreviation.git

lub wykonaj powyższe w jednym poleceniu za pomocą set-url:

git remote set-url origin [email protected]:subdomain/abbreviation.git

Następnie możesz po prostu zrobić git pushlub git pullzaktualizować zamiastgit push unfuddle master

dbr
źródło
1
Pisze, że przepycha się do originrepozytorium (chociaż nie jest świadomy tego, jak to działa w kategoriach git) - usunięcie pilota nie byłoby dla niego zbyt przydatne.
Arystoteles Pagaltzis,
10
Nie rozumiem, dlaczego ludzie redagują pytania. Zmienia znaczenie pytania, sprawia, że ​​istniejące odpowiedzi nie mają sensu i nie pozwala innym osobom wiedzieć, że pytający potrzebuje więcej informacji, ponieważ ich pytanie może być nieco „niepoprawne”.
stu
9
Usunięcie zdalnego źródła było dokładnie tym , czego potrzebowałem, ponieważ wskazywało na lokalne repozytorium, które już nie istniało, a nie na repozytorium nierozwinięte.
Brian Kelly,
3
stu: Nagrywanie jest dobrą rzeczą! Jeśli nie powiedzieli, to przede wszystkim nie ma sensu uzyskiwać odpowiedzi, które nie rozwiązują rzeczywistego problemu.
dbr
4
Ale o wiele łatwiej jest się złościć i być zgorzkniałym. :-) Ale rozumiem twój punkt widzenia.
stu
286

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

Earl Jenkins
źródło
2
@Earl Nie git diff --cached origin/masterbył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)
nhed
48
Możliwe jest również, że musisz uruchomić, git fetchjeśli pojawi się ten błąd po git pull remote branch. Twoje referencje mogą być nieaktualne. git fetchnaprawia to.
bryan kennedy
czy origin/masterczęść oznacza masteroddział w originrepo?
Rakib
1
Pamiętaj, że ten opis jest niekompletny. Obecnie występuję, # 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ą.
rdm
1
Dostaję również ten komunikat, gdy muszę wyciągnąć z zamiast wypychać do źródła / master. np. z innego oddziału, jeśli git checkout masterdostanę wiadomość, co oznacza, że ​​powinienem git pull origin masterprzed pracą. ale uważam to za bardzo mylące, ponieważ sformułowanie wiadomości sugeruje
coś
38

Miałem problem podobny do tego, w którym znajdował się mój katalog roboczy, ahead of origin by X commitsale git pullwynikało z niego Everything 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:

$ git push {remote} {localbranch}:{remotebranch}

Gdzie słowa w nawiasach powinny być zastąpione nazwą zdalną, nazwą oddziału lokalnego i nazwą oddziału zdalnego. na przykład

$ git push origin master:master
Mims H. Wright
źródło
1
Dzięki, to mi zrobiło. git diffnic nie pokazałem, a po zrobieniu tego, co opisałeś, nie mam już tego mylącego i irytującego przesłania.
LaundroMat,
1
Potrzebuje więcej głosów pozytywnych :). Wszystkie wyżej głosowane odpowiedzi były dla mnie „bez efektu” (tj. „Git fetch” - nic nie zrobiło ... sprawdź „git zdalne pokazywanie pochodzenia” - nic niepoprawnego, nic nie wymagało zmiany)
Adam
24

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 updateto ponownie zsynchronizujesz master źródłowy z origin / master

zobacz zaakceptowaną odpowiedź na to pytanie

Różnice między git pull origin master i git pull origin / master

chim
źródło
10

Myślałem, że mój laptop jest źródłem…

To trochę nonsensowne: originodnosi się do domyślnego zdalnego repozytorium - tego, z którego zwykle pobierasz / pobierasz zmiany innych osób.

Jak mogę:

  1. git remote -vpokaże ci, co originjest; origin/masterjest twoją „zakładką” dla ostatniego znanego stanu masteroddziału originrepozytorium, a twoją własną masterjest gałąź śledzenia dla origin/master. To wszystko tak, jak powinno być .

  2. Ty nie. Przynajmniej nie ma sensu, aby repozytorium było domyślnym repozytorium dla siebie.

  3. 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).

Arystoteles Pagaltzis
źródło
1
Zakładam, że mój laptop był źródłem, ponieważ właśnie tam utworzyłem repozytorium (skąd się wzięło).
Brian Kelly,
1
W przeciwieństwie do mnie, sensowne jest dla mnie originlokalne 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 pushi git pullza każdym razem, nie ma potrzeby, aby myśleć o tym, czy jesteś podłączony do właściwej sieci obecnie. Ten lokalny originmoż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.
Tino,
2
Wskazując originw innym repozytorium na swoim laptopie sens, pewnie. Skierowanie originrepozytorium na siebie nie robi jednak: nie ma znaczenia, czy działasz, czy git pushteż git pull, ponieważ repozytorium i tak zawsze jest dokładnie zsynchronizowane ze sobą. To błahe, trochę tautologiczne.
Arystoteles Pagaltzis
3

[ Rozwiązanie ]

$ git push origin

^ 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.

Chris
źródło
1

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.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Tworzę klon rep1 i nazywam go rep2. Zaglądam do rep2 i widzę, że plik jest poprawny.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

W rep1 dokonuję pojedynczej zmiany w pliku i zatwierdzam go. Następnie w rep1 tworzę pilota do wskazywania rep2 i wypycham zmiany.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Teraz, kiedy wchodzę w rep2 i robię status „git”, dostaję informację, że jestem przed początkiem.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

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?

Steve Hindmarch
źródło
1
Dwie rzeczy: sprawdzenie „pochodzenia / wzorca” rep2 w rzeczywistości nie wygląda na rep1. Jeśli wykonasz „git pull” w rep2, zauważysz, że są w tym samym stanie i przestaną narzekać. Aby zobaczyć zmiany z wypychania w kopii roboczej, musisz zrobić „wypłatę z git” - wypychania nigdy nie dotykają kopii roboczej rep rep.
Walter Mundt
Myślałem, że może tak być, ale pojawia się komunikat „git checkout M README Twój oddział wyprzedza„ origin / master ”o 1 zatwierdzenie.” Ale mój egzemplarz roboczy jest opóźniony o 1 zatwierdzenie, a nie wyprzedzenie.
Steve Hindmarch
1

Czeka na ciebie „push”. Próbować:

$ git push

Vino
źródło
1

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

git rm $(git ls-files --deleted)

A potem uruchomiłem zatwierdzenie i push.

To rozwiązało problem.

looneydoodle
źródło
1
Działa to tylko wtedy, gdy komunikat zatwierdzenia mówi delete - <nazwa pliku>
looneydoodle
1

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)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

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

Nara Narasimhan
źródło
0

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:

git remote

Usuń ten, którego nie potrzebujesz

git remote rm {insert remote to remove}
Jason Rikard
źródło
0

Możliwe jest zresetowanie do konkretnego zatwierdzenia przed dokonaniem własnych zatwierdzeń.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Służy git logdo znajdowania zatwierdzenia, które miałeś przed wprowadzeniem lokalnych zmian.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Zanotuj lokalne zatwierdzenia i zresetuj bezpośrednio do poprzedniego zatwierdzenia:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
RobLoach
źródło
-1

Miałem problem „Twoja gałąź wyprzedza„ origin / master ”przez nn commits.” po przekazaniu do zdalnego repozytorium za pomocą:

git push ssh://[email protected]/yyy/zzz.git

Kiedy odkryłem, że mój zdalny adres znajduje się w pliku .git / FETCH_HEAD i użyłem:

git push

problem zniknął.

Nowicjusz
źródło