Come funzionano i rami Git? Posso rimuovere il ramo principale?


22

Ho un progetto che ha 2 filiali, sviluppo e produzione. Non sto usando il ramo master e ogni volta che scrivo git statusmi dice quanto è lontano il mio ramo dal master.

Quando provo a eliminare il ramo principale, git branch -d masterlo elimina solo sul mio repository locale e non sul server git remoto. Qualche idea?

Risposte:


34

In Git, una filiale è solo un elenco ordinato di commit (ovvero: checkin). Qualcosa che può essere un po 'confuso per i nuovi utenti è che le filiali non hanno bisogno di avere un nome (sebbene nella maggior parte dei casi tu ne voglia uno); e non c'è nulla di particolarmente speciale in ogni particolare ramo (il masterramo è solo quello predefinito creato per te quando si inizializza un repository).

Probabilmente lo sai già, ma Git è diverso da alcuni altri sistemi di controllo della versione come il popolare "Subversion", perché ogni "copia di lavoro" (in linguaggio Subversion) è un repository a parte ... in realtà, non c'è nulla di particolarmente speciale su qualsiasi copia particolare; salvo che una copia è stata generalmente concordata come quella "canonica" utilizzata per conservare il prodotto finale.

Quindi, tornando alla tua domanda ... il repository "canonico" che hai clonato quando hai avviato la tua copia locale conteneva un ramo "master" per impostazione predefinita; ed è bloccato in giro. Ora, se si avesse accesso al computer che contiene il repository principale, è possibile accedere ed eseguire:

git branch -d master

Tuttavia, se non sei in grado di farlo, puoi comunque farlo dal tuo computer locale. Il git branchcomando ha -run'opzione che influenza il repository remoto. In altre parole, dovrebbe funzionare il seguente comando:

git branch -d -r master

Si noti che in entrambi i casi; Suppongo che mastersia stato completamente unito alla storia dello sviluppo in cui si trova attualmente la tua copia locale. Se non hai mai usato masterprima (ovvero: hai mai effettuato il check-in developmento production), non hai nulla di cui preoccuparti. Tuttavia, se tu (o qualcun altro) hai controllato le cose master, potresti avere un problema. È possibile forzare un'eliminazione modificando -din -Dnei comandi precedenti; ma consiglio vivamente di controllare per vedere cosa c'è in masteranticipo! Se non hai accesso al computer remoto, probabilmente non sarai in grado di recuperarlo!


A proposito; se tu (o chiunque altro) sei nuovo di Git, consiglio vivamente di leggere Git dal Bottom Up di John Wiegley . Anche se avevo usato Git un po 'da solo prima di trovare questo articolo, non ho davvero capito come funzionasse fino a quando non l'ho letto. È abbastanza utile!


3
Qualche tempo da quando ho scritto il mio commento originale, il comportamento di Git è leggermente cambiato. A partire da git 1.7.12, git branch -d -r masternon cancella più il ramo remoto, ma elimina la conoscenza del ramo remoto della tua copia locale. La prossima volta git fetch, il ramo tornerà! Invece, ti consigliamo di correre git push origin :master. In sostanza quello che stai facendo qui è di spingere un ramo null (il nome del ramo vuoto a sinistra del :) sopra il ramo remoto (il nome del ramo sul lato destro del :), eliminandolo efficacemente.
mparker17,

Dovresti anche notare che quando cloni un repository di solito esegui il checkout del master. Questo dipende dal riferimento HEAD nel repository che stai clonando. Quindi dopo l'eliminazione del master, assicurarsi che HEAD punti sul ramo desiderato come predefinito.
Zitrax,

Il tuo link a Git dal basso verso l'alto è morto, ma sembra che questo sia il testo a cui ti riferisci (?) Potresti confermare e forse aggiornare il link nella risposta?
OR Mapper,

O Mapper: Questo è il testo a cui mi riferisco: grazie per il nuovo link! Ho aggiornato il link nella risposta.
mparker17,

4

masterè il ramo predefinito per git. Non so perché sia ​​così terribile per te quando git ti dice quanto sei lontano dal master, ma se vuoi eliminare un ramo sul tuo repository remoto, eliminarlo localmente non è abbastanza. Prova questo invece:

git push origin :master

Ciò non invierà nulla (la parte prima dei due punti) sul server di origine e sovrascriverà il master. In altre parole, dovrebbe eliminare il ramo principale da remoto.


Ottengo: remoto: errore: rifiuto di eliminare il ramo corrente: refs / heads / master su github.com ***. Git! Errore [remote rifiutato] master (eliminazione del ramo corrente vietato):
impossibile inviare

1
MEM
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.