2010-08-21 16 views
8

Avevo un gruppo di rami separati e volevo unirli, poiché ognuno di essi era un aggiornamento di una parte diversa del programma.Riparazione del repository Git dopo l'unione non corretta

Suppongo che avrei dovuto fonderli, ma invece ho eseguito uno git commit -a dopo aver superato ogni ramo.

Poi ho realizzato che l'intero programma è tornato indietro nel tempo, quindi ho eseguito uno git reset --soft HEAD (ho letto in un articolo da qualche parte che questo dovrebbe aiutare), ma questo non ha fatto nulla.

Ho anche ricevuto questo messaggio da Git circa la rimozione manuale di alcuni ./git/index.lock così l'ho spostato a ./git/backup_of_index.lock, ma non sembrava che facesse nulla.

Come posso risolvere il mio repository e unire tutti i rami?

+3

ripristinare una di backup funziona sempre per me –

+8

In primo luogo, eseguire un backup completo del vostro albero di lavoro e 'cartella .git' ora e metterlo in un posto sicuro, preferibilmente in sola lettura. Da quello che hai detto sembra molto improbabile che tu abbia perso il lavoro (no 'reset --hard', e sembra che tu stia scherzando con le cose impegnate sui rami). Una volta che hai finito, trova un esperto di git su un canale interattivo da qualche parte in grado di parlare attraverso come cercare e ripristinare il tuo stato precedente. StackOverflow non è quasi certamente il forum per questo perché hai bisogno di aiuto interattivo, non solo di domande e risposte. –

+0

Grazie a tutti, userò tutto il suggerimento e capirò qualcosa, non posso ancora scegliere una risposta. –

risposta

1

Errori:

  1. "Ho iniziato a giocare con git sul mio nuovo progetto"
  2. "Volevo solo per unirle come ognuno di loro erano un aggiornamento per diverse parti del programma"

Non dovresti giocare con territori sconosciuti quando il tuo codice significa qualcosa. Se desideri farlo, almeno avere un piano di riserva.

Il recupero di emergenza sembra essere importante solo per coloro che ne hanno più bisogno ma a quel punto è troppo tardi.

Sono tutto per la sperimentazione ma odio vedere questo tipo di situazione, mi sento male per lo sviluppatore perché conosco le sue scarpe troppo bene però dopo aver imparato questo errore una volta che non lo dimenticherete mai.

Prima di decidere di giocare, prendi il tuo codice e gettalo da qualche altra parte così quando sh * t colpisce il ventilatore puoi tornare alla tua zona di comfort e continuare a lavorare come uno sviluppatore felice e tornare a giocare dopo aver ottenuto il tuo lavoro fatto.

+0

Mentre sono d'accordo con i tuoi punti, questa non è una risposta alla domanda. Dovrebbe essere pubblicato come commento (anche se sono consapevole che i commenti non possono contenere questo testo). – Jeff

+4

Inizialmente ho iniziato a digitare il commento e ho esaurito la stanza. : -/ – Chris

4

A meno che non si siano compromessi i dati nella directory .git, è improbabile che tu abbia perso qualcosa. Potresti avere un pasticcio terribile da ripulire, e potrebbe richiedere molto tempo per capire cosa hai fatto e dove si trova, ma probabilmente non hai perso nulla.

Questa è la buona notizia.

La cattiva notizia è che sarà diabolicamente difficile per chiunque aiutarti molto.

È probabile che sia necessario identificare tutti i rami e tracciare indietro i commit su ciascuno. Dovrai decidere se tutte quelle operazioni 'git commit -a' sono state una buona idea. Sembra improbabile, quindi potrebbe essere necessario eseguire le unioni correttamente, lavorando dal prossimo all'ultimo commit su ciascun ramo.

Devi anche decidere cosa stavi davvero cercando di fare.

Sembra che tu abbia voluto unire un certo numero di rami - chiamarli BranchA, BranchB e BranchC - sul ramo principale, master. Ma non è chiaro che è quello che hai provato.

Dato che le cose sono un pasticcio, consiglio di creare un altro ramo che possiamo chiamare "Correzione". Crea questo dal capo del ramo principale.Quindi, unire la versione appropriata di ciascuna di BranchA, BranchB e BranchC nel ramo Fixup. Ad ogni fase, controlla che il codice funzioni correttamente - passa la sua suite di test, ecc. Controlla ciascuna unione separatamente sul ramo Fixup.

Quando si è certi che il ramo Fixup è corretto, tornare al ramo master e unire il ramo Fixup al master.


Charles Bailey rende il suggerimento molto sensibile (in un commento alla domanda): prima di fare qualsiasi altra cosa, fare una copia di backup di quello che hai, esattamente come è attualmente. Solo allora procedere con qualsiasi operazione di pulizia. E il suo suggerimento di ottenere aiuto interattivo è anche ragionevole.

14

Il comando git più importante in questa situazione è git reflog. Il reflog tiene traccia di tutte le modifiche apportate a ciascuna particolare diramazione e il comando git reflog elenca tutte le modifiche alla testa della diramazione andando indietro nel tempo.

Se è possibile identificare un ID commit "buono" utilizzando il reflog (e sarà lì, da qualche parte), allora sei molto più avanti di dove sei ora. Se una buona commettere id è dire, abc123, allora il comando:

git checkout -b rescue abc123 

crea una nuova filiale denominata rescue presso l'id abc123 commettere.

Quando stavo imparando git, avevo un tipo simile di "dove diamine sono io e come sono arrivato qui?" momento. Ho saputo del reflog su un different Stack Overflow question, ed è stata la cosa più preziosa da sapere su Git.

+0

Io secondo questo commento come quello che dovresti prestare attenzione a Jonathan. Esegui 'git reflog' (o' git log -g' per ottenere le stesse informazioni con altri dati), trova l'ultimo commit che era buono e controlla un ramo in quel punto. –

+0

Inoltre, c'è un po 'di documentazione su una situazione come questa: http://progit.org/book/ch9-7.html#data_recovery –

+0

Stavo venendo qui per dire "reflog!" solo dal titolo della domanda da solo. – masonk

1

Una delle cose meravigliose di Git è che è possibile duplicare facilmente l'intero repository funzionante. Ciò consente di conservare una copia di backup mentre si sperimenta la ramificazione e la fusione.

Il mio approccio suggerito per risolvere il tuo problema attuale:

  1. Creare una copia di backup dell'intero repository
  2. Esperimento con copie e getta del repository
  3. Ogni volta che si fallisce un throw- repository away - buttalo via e ricomincia da capo con una nuova copia dal tuo backup
  4. Alla fine, inizierai a padroneggiare l'hacking repo: avrai recuperato il tuo lavoro e ti sentirai bene con ciò che hai imparato

Inoltre, spero che si sta utilizzando gitk (o simile) per esaminare gli effetti delle modifiche - si può davvero aiutare a visualizzare le diverse linee di codice e come essi sono correlati.

gitk --all ## show me all the branches 
+0

Inoltre (ancora meglio?): 'Gitk --reflog' - Penso che questa sia una nuova funzionalità, ma molto utile. – nobar

Problemi correlati