2012-01-29 14 views
25

Jestem nowym do git, a ja nie mogę zrozumieć następujące zachowanie:„Twój oddział wyprzedza«pochodzenia/Master»przez 1 popełnienia” na wyraźną naciśnięciem

Mam repo bitbucket że Sklonowuję lokalnie, a następnie modyfikuję i zatwierdzam lokalnie, a następnie naciskam na zdalne repozytorium. Jeśli wykonam niejawne naciśnięcie lub "popchnij pochodzenie", nie ma problemu. Jeśli pchnę za pomocą jawnego zdalnego adresu URL, otrzymam komunikat stanu "Twój oddział wyprzedza" origin/master "o 1 commit".

Wygląda na to, że git nie rozpoznaje jawnego adresu jako identycznego z oryginałem, więc co dokładnie się dzieje. Jeśli wykonam kolejne niejawne pchnięcie, to nic nie robi, ale usuwa komunikat.

Oto sesja próbki:

[email protected]:/more/coding/git-tests/ask1$ git --version 
git version 1.7.2.5 

[email protected]:/more/coding/git-tests$ git clone https://[email protected]/shishani/dirasi.git ask1 
Cloning into ask1... 
Password: 
remote: Counting objects: 24054, done. 
remote: Compressing objects: 100% (6300/6300), done. 
remote: Total 24054 (delta 17124), reused 24024 (delta 17106) 
Receiving objects: 100% (24054/24054), 11.83 MiB | 251 KiB/s, done. 
Resolving deltas: 100% (17124/17124), done. 

[email protected]:/more/coding/git-tests$ cd ask1 

[email protected]:/more/coding/git-tests/ask1$ jed setup.py 

[email protected]:/more/coding/git-tests/ask1$ git commit -a 
[master a053f28] modified: setup.py 
1 files changed, 1 insertions(+), 0 deletions(-) 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

[email protected]:/more/coding/git-tests/ask1$ git remote show origin 
Password: 
* remote origin 
    Fetch URL: https://[email protected]/shishani/dirasi.git 
    Push URL: https://[email protected]/shishani/dirasi.git 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    master merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (fast-forwardable) 

[email protected]:/more/coding/git-tests/ask1$ git push 
Password: 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (3/3), done. 
Writing objects: 100% (3/3), 314 bytes, done. 
Total 3 (delta 2), reused 0 (delta 0) 
remote: bb/acl: shishani is allowed. accepted payload. 
To https://[email protected]/shishani/dirasi.git 
    5e9ffd1..a053f28 master -> master 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
nothing to commit (working directory clean) 

[email protected]:/more/coding/git-tests/ask1$ jed setup.py 

[email protected]:/more/coding/git-tests/ask1$ git commit -a 
[master 6d0e236] modified: setup.py 
1 files changed, 1 insertions(+), 0 deletions(-) 

[email protected]:/more/coding/git-tests/ask1$ git push https://[email protected]/shishani/dirasi.git master 
Password: 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (3/3), done. 
Writing objects: 100% (3/3), 298 bytes, done. 
Total 3 (delta 2), reused 0 (delta 0) 
remote: bb/acl: shishani is allowed. accepted payload. 
To https://[email protected]/shishani/dirasi.git 
    a053f28..6d0e236 master -> master 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
**# Your branch is ahead of 'origin/master' by 1 commit.** <-- this does not reflect current state 
# 
nothing to commit (working directory clean) 

[email protected]:/more/coding/git-tests/ask1$ git push 
Password: 
Everything up-to-date 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
nothing to commit (working directory clean) 
+0

To pytanie zostało prawdopodobnie zamknięte niepoprawnie jako duplikat niewłaściwego pytania. Jak tylko skończę robić duplikat dla Git, zacznę ponownie otwierać i poprawnie zamykać takie pytania, jak duplikaty [inne Twój oddział wyprzedza pytania "origin/master"] (https://www.google .com/search? q = Twoja gałąź + jest + z wyprzedzeniem + z +% 27origin% 2Fmaster% 27). –

Odpowiedz

18

wierzę, trzeba wyciągnąć z powrotem na zmianę przed git zdadzą sobie sprawę, że odległy koniec został zaktualizowany. Możesz to zrobić za pomocą szybkiego git pull (lub, jak pokazujesz w swoim przykładzie, git push dla śledzonego pochodzenia).

Można również ręcznie zmienić zatwierdzenie, na które wskazuje refs/remotes/origin punktów.

Nie należy oczekiwać, że moduł do śledzenia treści rozpoznaje dowolne zdalne synonimy repozytoriów; Wyobraź sobie, że masz pięć różnych adresów URL, które wszystkie były tym samym repozytorium po stronie serwera. Kiedy naciskasz na repozytorium A, czy oznacza to, że twoje zmiany zostały zatwierdzone do repozytorium B (źródło twojego oddziału)? git nie ma możliwości dowiedzenia się. Zamiast tego aktualizuje tylko odwołanie do głowicy zdalnej w dwóch przypadkach: pociągnięcie i przycisk do domyślnego miejsca docelowego.

+0

Zgadzam się z tym, co mówisz o repozytorium o różnych synonimach, ale jeśli używamy dokładnie tego samego adresu URL, o którym już wiedział git (i jest zgłaszane przez "zdalne show origin"), to dlaczego nie powinien on rozpoznawać fakt. W końcu adres URL wskazuje na unikalny zasób. Z drugiej strony, jeśli użytkownik używa innego synonimu, byłby tego świadomy i nie oczekuje, że git rozpozna wskazanie tego samego zasobu. –

+0

@BaselShishani To śliskie zbocze. Jeśli zrobiłeś to, co sugerujesz, i porównałeś dokładny ciąg adresów URL (tak łatwo!), Wciśnięcie 'https: // shishani @ bitbucket.org/shishani/dirasi.git' zaktualizowałoby nagłówek i' http: // shishani @ bitbucket.org/shishani/dirasi.git' would not. Ditto łańcuchy zapytań, różne protokoły, dodatkowe ukośniki, wielkie litery ... Możesz przesłać prośbę o dodanie funkcji do gitarzystów, są mili! – Borealid

8

Tak, w takim przypadku należy wykonać git fetch lub git fetch origin. Git nie dba o to, gdzie się popychasz, tylko zdalne (i zdalne śledzenie oddziałów) jest wszystkim, co ma znaczenie, gdy zgłaszasz status liczby zatwierdzeń, które wyprzedzasz itd.

19

Kiedy status mówi: Your branch is ahead of 'origin/master' by 1 commit, oznacza to origin/master. Oznacza to, że w repozytorium znajduje się wskaźnik o nazwie origin/master wskazujący na zatwierdzenie, które jest HEAD tego remote branch, a twoje master wyprzedza to zatwierdzenie.

Dla wszystkich pilotów rozpoznawanych przez repo, tworzy wskaźnik <remote>/<branchname> w repozytorium, jeśli ciągniesz/pchasz/pobierasz. Jest to tylko wskaźnik do zatwierdzenia, a jeśli spróbujesz uzyskać tę gałąź, będziesz w stanie odłączenia.

Najwyraźniej ten wskaźnik jest aktualizowany, gdy robisz git push lub git push origin master, ale wyraźnie pcha do adresu URL nie aktualizuje tego wskaźnika, a więc stan.

Jeśli po kliknięciu adresu URL zostanie po prostu zrobione git fetch lub git pull, komunikat o statusie zniknie również w takim przypadku.

UWAGA: Jeśli masz kilka piloty i ustawić swój oddział do śledzenia innego zdalnego oddziału, jak powiedzieć upstream master, wiadomość stanu będzie w tym przypadku, na przykład, Your branch is ahead of 'upstream/master' by 1 commit. Jest to więc tylko śledzona gałąź zdalna, do której dokonuje się porównania. Zobacz git config, aby zobaczyć, jakie zdalne odgałęzienie śledzić będzie aktualna gałąź.

0

zauważyć, że ponieważ git1.8.1rc1 (grudzień 2012), Git will include hint messages:

if (advice_status_hints) 
+  strbuf_addf(sb, 
+  _(" (use \"git push\" to publish your local commits)\n")); 

Kiedy "git checkout" sprawdza się oddział, to informuje użytkownika, jak daleko z tyłu (lub do przodu) nowy oddział jest w stosunku do zdalnej gałęzi śledzenia, na której opiera się.
Wiadomość teraz również informuje, jak je zsynchronizować, naciskając lub ciągnąc.

Można to wyłączyć za pomocą zmiennej konfiguracyjnej advice.statusHints.

Powiązane problemy