Come posso trovare la posizione di origine / master in git e come posso cambiarla?


227

Sono un principiante Git. Di recente ho spostato un progetto Rails da Subversion a Git. Ho seguito il tutorial qui: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

Sto anche usando unfuddle.com per memorizzare il mio codice. Apporto le modifiche sul mio laptop Mac sul treno per / dal lavoro e poi le spingo per disordinarle quando ho una connessione di rete usando il seguente comando:

git push unfuddle master

Uso Capistrano per le distribuzioni e estraggo il codice dal repository unfuddle usando il ramo master.

Ultimamente ho notato il seguente messaggio quando eseguo "git status" sul mio laptop:

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

E sono confuso sul perché. Pensavo che il mio laptop fosse l'origine ... ma non so se o il fatto che originariamente mi sono trasferito da Subversion o che abbia spinto verso Unfuddle sia ciò che sta facendo apparire il messaggio. Come posso:

  1. Scopri dove Git pensa che sia 'origine / padrone'?
  2. Se è da qualche altra parte, come posso trasformare il mio laptop in "origine / master"?
  3. Ricevi questo messaggio per andare via. Mi fa pensare che Git non sia contento di qualcosa.

Il mio mac esegue Git versione 1.6.0.1.


Quando corro git remote show origincome suggerito da dbr, ottengo quanto segue:

~/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

Quando corro git remote -vcome suggerito da Aristotele Pagaltzis, ottengo quanto segue:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

Ora, cosa interessante, sto lavorando al mio progetto nella geekfordirectory ma dice che la mia origine è la mia macchina locale nella gfdirectory. Credo che sia gfstata la directory temporanea che ho usato quando ho convertito il mio progetto da Subversion a Git e probabilmente da dove ho spinto a srotolarlo. Quindi credo di aver estratto una nuova copia dalla cartella alla geekfordirectory.

Quindi sembra che dovrei seguire i consigli di dbr e fare:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git

Risposte:


202

1. Scopri dove Git pensa che usi 'origin / master' git-remote

git remote show origin

..che restituirà qualcosa come ..

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Un telecomando è fondamentalmente un collegamento a un repository remoto. Quando lo fai..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

..git spingerà le modifiche all'indirizzo che hai aggiunto. È come un segnalibro, per repository remoti.

Quando esegui git status, controlla se mancano commit del telecomando (rispetto al tuo repository locale) e, in tal caso, da quanti commit. Se invii tutte le modifiche a "origine", entrambe saranno sincronizzate, quindi non riceverai quel messaggio.

2. Se è altrove, come posso trasformare il mio laptop in "origine / master"?

Non ha senso farlo. Di '"origine" è stato rinominato "laptop" - non lo vorrai mai faregit push laptop dal tuo laptop.

Se si desidera rimuovere il telecomando di origine, si fa ..

git remote rm origin

Questo non eliminerà nulla (in termini di contenuto del file / cronologia delle revisioni). Questo interromperà il messaggio "il tuo ramo è avanti di ..", poiché non confronterà più il tuo repository con il telecomando (perché non c'è più!)

Una cosa da ricordare è che non c'è nulla di speciale origin, è solo un nome predefinito che git usa.

Git usa origindi default quando fai cose come git pusho git pull. Quindi, se hai un telecomando che usi molto (Unfuddle, nel tuo caso), consiglierei di aggiungere unfuddle come "origin":

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

oppure esegui quanto sopra in un comando usando set-url:

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

Quindi puoi semplicemente fare git pusho git pullaggiornare, invece digit push unfuddle master


1
Scrive che spinge verso il originrepository (anche se non è a conoscenza di come funziona in termini git) - la rimozione del telecomando difficilmente sarebbe una cosa utile da fare per lui.
Aristotele Pagaltzis,

10
Non capisco perché le persone riformulino le domande. Cambia il significato della domanda, rende insensate le risposte esistenti e non fa sapere ad altre persone che la domanda ha bisogno di maggiori informazioni in base al fatto che la loro domanda potrebbe essere leggermente "errata".
stu,

9
La rimozione dell'origine remota era esattamente ciò di cui avevo bisogno perché puntava a un repository locale che non esisteva più, non al repository dislocato.
Brian Kelly,

3
stu: riformulare è una buona cosa! Se non hanno parlato è chiaramente in primo luogo, non ha senso ottenere risposte che non risolvano il problema reale.
dbr

4
Ma è molto più facile arrabbiarsi ed essere amareggiato. :-) Ma vedo il tuo punto.
stu

286

Sono arrivato a questa domanda cercando una spiegazione su cosa significhi il messaggio "il tuo ramo sta per ..." nello schema generale di git. Non c'è stata risposta a questo qui, ma dal momento che questa domanda appare attualmente nella parte superiore di Google quando cerchi la frase "Il tuo ramo è davanti a" origine / master "", e da allora ho capito cosa significa davvero il messaggio , Ho pensato di pubblicare le informazioni qui.

Quindi, essendo un principiante git, posso vedere che la risposta di cui avevo bisogno era una risposta distintamente newbie. In particolare, ciò che significa la frase "il tuo ramo è davanti a ..." è che ci sono file che hai aggiunto e impegnato nel tuo repository locale, ma non hai mai spostato sull'origine. L'intento di questo messaggio è ulteriormente offuscato dal fatto che "git diff", almeno per me, non ha mostrato differenze. Solo quando ho eseguito "git diff origin / master" mi è stato detto che c'erano differenze tra il mio repository locale e il master remoto.

Quindi, per essere chiari:


"your branch is ahead by ..." => Devi spingere verso il master remoto. Eseguire "git diff origin / master" per vedere quali sono le differenze tra il repository locale e il repository principale remoto.


Spero che questo aiuti altri neofiti.

(Inoltre, riconosco che ci sono sottigliezze di configurazione che possono parzialmente invalidare questa soluzione, come il fatto che il master potrebbe non essere effettivamente "remoto" e che "origine" è un nome riconfigurabile usato dalla convenzione, ecc. Ma i neofiti lo fanno non ci importa di questo genere di cose. Vogliamo risposte semplici e dirette. Possiamo leggere le sottigliezze in seguito, una volta risolto il problema urgente.)

Conte


2
@Earl Non git diff --cached origin/mastersarebbe un'istruzione migliore qui in quanto indica quale sarebbe il risultato della prossima spinta? Il comando evidenziato che hai sopra mostra anche file non registrati e non messi in scena (penso, sono anche un principiante git)
nhed

48
È anche possibile che tu debba eseguirlo git fetchse ricevi questo errore dopo un git pull remote branch. I tuoi riferimenti potrebbero non essere aggiornati. git fetchlo risolve.
Bryan Kennedy il

cosa origin/mastersignifica la parte masterin originrepo?
Rakib,

1
Si noti che questa descrizione è incompleta. Attualmente sto sperimentando # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Ma git diff origin / master non mostra nulla (e l'opzione --cached non cambia questo). E, git fetch non cambia questo, git pull non cambia questo, git reset - non lo cambia. Per cambiare questo, avevo bisogno di: git reset --hard origin / master E ho scelto quella rotta perché altre persone stanno lavorando con me in questo repository e non volevo invalidare i loro test, e perché non sono riuscito a scoprire cosa commettono siamo.
rdm,

1
Ricevo anche questo messaggio quando devo estrarre piuttosto che spingere verso origin / master. ad esempio da un altro ramo se git checkout masterricevo il messaggio, il che significa che dovrei git pull origin masterprima di lavorare. ma lo trovo molto confuso perché la formulazione del messaggio suggerisce il contrario
Anentropic

38

Ho avuto un problema simile a quello in cui si trovava la mia directory di lavoro ahead of origin by X commitsma il git pullrisultato era Everything up-to-date. Sono riuscito a risolverlo seguendo questo consiglio . Sto pubblicando questo qui nel caso in cui aiuti qualcun altro con un problema simile.

La correzione di base è la seguente:

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

Dove le parole tra parentesi devono essere sostituite dal nome remoto, dal nome della filiale locale e dal nome della filiale remota. per esempio

$ git push origin master:master

1
Grazie, è stato per me. git diffnon ha mostrato nulla e dopo aver fatto quello che hai descritto non ricevo più questo messaggio confuso e fastidioso.
LaundroMat

1
Ha bisogno di più voti :). Le risposte più votate sono state tutte "senza effetto" per me (cioè "git fetch" - non ha fatto nulla ... controlla "git remote show origin" - niente di sbagliato, niente ha bisogno di cambiare)
Adam


10

Pensavo che il mio laptop fosse l'origine ...

È un po 'assurdo: si originriferisce al repository remoto predefinito, quello da cui solitamente si prelevano / estraggono le modifiche di altre persone.

Come posso:

  1. git remote -vti mostrerà ciò che originè;origin/masterè il tuo "segnalibro" per l'ultimo stato noto del masterramo del originrepository e il tuo masterè un ramo di monitoraggio per origin/master. Questo è tutto come dovrebbe essere .

  2. Tu no. Almeno non ha senso che un repository sia il repository remoto predefinito per se stesso.

  3. Non lo è. Ti sta semplicemente dicendo che hai fatto così tanti commit a livello locale che non sono nel repository remoto (secondo l'ultimo stato noto di quel repository).


1
Ho pensato che il mio laptop fosse l'origine, poiché è lì che ho creato il repository (dove è nato).
Brian Kelly,

1
Al contrario, per me ha perfettamente senso originindicare il laptop localmente, poiché essere offline o cambiare rete è un caso molto comune per dispositivi portatili come i laptop. In questo modo è possibile utilizzare git pushe in git pullqualsiasi momento, non è necessario pensare se si è attualmente connessi alla rete giusta. Questo locale originpuò essere sincronizzato automaticamente con i telecomandi reali quando è disponibile un collegamento di rete, a seconda dello stato di roaming corrente. La parte problematica è quando eseguire quale sincronizzazione, rispetto a quella la parte GIT è abbastanza facile.
Tino,

2
Indicando originin un altro repository sul vostro computer portatile ha perfettamente senso, certo. Indicare il originrepository su se stesso, tuttavia, non lo farà: non farebbe alcuna differenza se lo si esegue git pusho git pull, poiché un repository è comunque sempre esattamente sincronizzato con se stesso. È err, un po 'tautologico.
Aristotele Pagaltzis,

3

[Soluzione]

$ git push origin

^ questo mi ha risolto. Quello che ha fatto, ha sincronizzato il mio master (sul laptop) con "origin" sul server remoto.


1

Sto lottando con questo problema e nessuna delle risposte precedenti affronta la domanda come la vedo io. Ho riportato il problema alle origini per vedere se riesco a chiarire il problema.

Creo un nuovo repository (rep1), inserisco un file e lo commetto.

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

Creo un clone di rep1 e lo chiamo rep2. Guardo dentro rep2 e vedo che il file è corretto.

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

In rep1 apporto una singola modifica al file e lo commetto. Quindi in rep1 creo un telecomando per puntare a rep2 e spingere le modifiche.

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

Ora quando vado in rep2 e faccio uno 'stato git' mi viene detto che sono davanti all'origine.

# 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
#

README in rep2 è com'era in origine, prima del secondo commit. Le uniche modifiche che ho fatto sono rep1 e tutto quello che volevo fare era spingerle fuori a rep2. Cosa non sto afferrando?


1
Due cose: il controllo "origine / master" di rep2 in realtà non guarda rep1. Se fai un 'git pull' in rep2, noterà che sono nello stesso stato e smetteranno di lamentarti. Per visualizzare effettivamente le modifiche da un push in una copia di lavoro, è necessario eseguire un "checkout git": i push non toccano mai la copia di lavoro del repository dest.
Walter Mundt,

Ho pensato che potesse essere così, ma ricevo "git checkout M README Il tuo ramo è avanti di" origin / master "di 1 commit." Ma la mia copia di lavoro è in realtà dietro di 1 commit, non avanti.
Steve Hindmarch,

1

Ti sta aspettando per "spingere". Provare:

$ git push


1

Ho avuto questo problema di recente e ho pensato che fosse perché avevo eliminato alcuni file che non mi servivano più. Il problema è che git non sa che i file sono stati cancellati e vede che il server ce l'ha ancora. (server = origine)

Quindi ho corso

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

E poi ha eseguito un commit e push.

Ciò ha risolto il problema.


1
Funziona solo se il messaggio di commit dice delete - <nome file>
looneydoodle il

1

Sono anche un principiante. Ho avuto lo stesso problema con i messaggi "la tua filiale è in anticipo rispetto all'origine / master di N commit". Fare il suggerito 'git diff origin / master' ha mostrato alcune differenze che non mi interessava tenere. Così ...

Dal momento che il mio clone git era per l'hosting e volevo una copia esatta del repository master e non mi importava di conservare le modifiche locali, ho deciso di salvare l'intero repository e crearne uno nuovo:

(sulla macchina di hosting)

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

Per convenienza, ero solito apportare modifiche al clone sul mio computer di hosting. Non piu. Apporterò queste modifiche al master, git ci impegnerò e farò un git pull. Spero che questo dovrebbe mantenere il mio clone git sul computer di hosting in completa sincronizzazione.

/ Nara


0

Mi chiedevo la stessa cosa per il mio repository. Nel mio caso avevo un vecchio telecomando a cui non spingevo più, quindi dovevo rimuoverlo.

Ottieni l'elenco dei telecomandi:

git remote

Rimuovi quello che non ti serve

git remote rm {insert remote to remove}

0

È possibile ripristinare un commit specifico prima che vengano eseguiti i propri commit.

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

Utilizzare git logper trovare quale commit è stato il commit che hai avuto prima che le modifiche locali avessero luogo.

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

Prendi nota dei commit locali e ripristina direttamente il commit precedente:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

Ho avuto il problema "La tua filiale è in anticipo su 'origin / master' di nn commit." quando ho inviato a un repository remoto con:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

Quando ho scoperto che il mio indirizzo remoto era nel file .git / FETCH_HEAD e ho usato:

git push

il problema è scomparso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.