2012-01-29 13 views
25

Sono nuovo di git, e non riesco a dare un senso al seguente comportamento:'Il vostro ramo è più avanti di 'origin/master' da 1 commettere' sulla spinta esplicito

Ho un repo bitbucket che Io clone localmente, quindi modifico e eseguo il commit localmente, quindi spingo al repository remoto. Se faccio un push implicito, o 'push origin', non c'è problema. Se spingo usando l'URL remoto esplicito, ottengo il messaggio di stato "Il tuo ramo è più avanti di" origine/master "di 1 commit".

Sembra che git non riconosca l'indirizzo esplicito come uguale all'origine, quindi cosa sta succedendo esattamente. Se faccio un'altra spinta implicita, non fa nulla, ma cancella il messaggio.

Ecco un esempio di sessione:

[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

Questa domanda è stata probabilmente chiusa in modo errato come duplicato della domanda sbagliata. Non appena avrò finito di ottenere un dupe hammer per Git, inizierò a riaprire e chiudere correttamente domande come questa come duplicati di [altro Il tuo ramo è più avanti delle domande 'origine/master'] (https://www.google .com/search? q = Il vostro ramo + + è + avanti + di +% 27origin% 2Fmaster% 27). –

risposta

18

Credo che hai bisogno di tirare il cambiamento indietro prima di git si renderà conto che la fine remoto è stato aggiornato. È possibile farlo tramite un rapido git pull (o, come si mostra nell'esempio, un git push all'origine tracciata).

È inoltre possibile modificare manualmente il commit a cui sono assegnati punti refs/remotes/origin.

Non è corretto aspettarsi che il localizzatore di contenuti riconosca sinonimi remoti arbitrari per i repository; Immagina se avessi cinque URL diversi che erano tutti lo stesso repository lato server. Quando si preme per repo A, significa che le modifiche sono state commesse al repo B (l'origine del ramo)? git non ha modo di saperlo. Invece, aggiorna solo il riferimento della testata remota in due casi: un tiro e una spinta alla destinazione predefinita.

+0

Sono d'accordo con quello che stai dicendo su un repository che ha sinonimi diversi, ma se stiamo usando lo stesso URL di cui git è già a conoscenza (ed è segnalato da "remote show origin"), allora perché non dovrebbe riconoscerlo il fatto. Dopo tutto, un URL punta a una risorsa unica. D'altra parte, se l'utente sta usando un sinonimo diverso, ne sarebbe consapevole e non si aspetta che git riconosca il suo puntamento alla stessa risorsa. –

+0

@BaselShishani Questa è una salita scivolosa. Se hai fatto ciò che suggerisci e hai confrontato la stringa esatta degli URL (così facile!), Quindi spingere 'https: // shishani @ bitbucket.org/shishani/dirasi.git' aggiornerebbe la testa e' http: // shishani @ bitbucket.org/shishani/dirasi.git' non lo farebbe. Idem per stringhe di query, protocolli diversi, barre extra, lettere maiuscole ... Puoi inviare una richiesta di funzionalità alle persone git, sono gentili! – Borealid

8

Sì, sarà necessario eseguire uno git fetch o git fetch origin in questo caso. A Git non importa dove si spinge, solo il telecomando (e le diramazioni remote) è tutto ciò che conta quando si riporta lo stato di quanti commit si è avanti ecc.

19

Quando lo stato dice Your branch is ahead of 'origin/master' by 1 commit, in realtà significa origin/master. Cioè, c'è un puntatore chiamato origin/master nel repository che punta al commit che è il HEAD di quello remote branch, e il tuo master è avanti a questo commit.

Per tutti i telecomandi riconosciuti dal repository, crea un puntatore <remote>/<branchname> nel repository, se si tira/spinge/recupera. È solo un puntatore al commit, e se provi a checkout quel ramo, staresti solo in uno stato indipendente.

Apparentemente, questo puntatore viene aggiornato quando si esegue git push o git push origin master, ma se si preme esplicitamente su un URL non si aggiornerà quel puntatore e quindi lo stato.

Se si esegue solo git fetch o git pull dopo aver premuto sull'URL, anche il messaggio di stato scompare in tal caso.

NOTA: Se si dispone di più telecomandi, e si imposta il ramo di rintracciare qualche altro ramo a distanza, come dire upstream master, il messaggio di stato sarà in questo caso essere, per esempio, Your branch is ahead of 'upstream/master' by 1 commit. Quindi è solo il ramo remoto tracciato che il confronto è fatto. Vedere git config per vedere quale ramo remoto sta monitorando il ramo corrente.

0

Si noti che, dal momento che git1.8.1rc1 (dicembre 2012), Git will include hint messages:

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

Quando "git checkout" estrae un ramo, che indica all'utente come molto indietro (o avanti) la nuova filiale è relativo al ramo di monitoraggio remoto su cui si basa.
Il messaggio ora indica anche come sincronizzarli spingendo o tirando.

Questo può essere disabilitato con la variabile di configurazione advice.statusHints.

Problemi correlati