2009-10-20 10 views
11

Il peggiore tra quelli in cui sono stato catturato era con i sottomoduli git. Ho avuto un sottomodulo per un progetto su GitHub. Il progetto non era mantenuto e volevo presentare le patch, ma non ci sono riuscito, quindi ho biforcuto. Ora il sottomodulo puntava verso la libreria originale, e io invece avevo bisogno che indicasse la forchetta. Così ho cancellato il vecchio sottomodulo e lo ho sostituito con un sottomodulo per il nuovo progetto nello stesso commit. Si scopre che questo ha rotto i repository di tutti gli altri. Non sono ancora sicuro di quale sia il modo corretto di gestire questa situazione, ma alla fine ho eliminato il sottomodulo, l'ho prelevato e aggiornato da tutti, quindi ho creato il nuovo sottomodulo e ho fatto eseguire nuovamente il pull e l'aggiornamento a tutti. Ci è voluta la parte migliore di un giorno per capirlo.Di che razza di git hai preso?

Cosa hanno fatto altre persone per rovinare accidentalmente repository git in modi non ovvi e come è stato risolto?

+0

Questo è un duplicato di http://stackoverflow.com/questions/1491766/what-are-common-antipatterns-of-using-git e le risposte devono essere unite. – innaM

+0

Un "gotcha" non è proprio la stessa cosa di un "anti-pattern". Ho chiesto della distruzione del deposito, mi ha chiesto delle pratiche peggiori. –

risposta

14

Il solito slash quando adding a submodule:

Quando si utilizza git add su un modulo, assicurarsi che non si dispone di una barra tailing.

> git add local/path 
    -- adds the submodule 

> git add local/path/ 
    -- adds all the files in the submodule directly into your repository, big no-no 
11

Non è un getcha, è un git cha.

+21

Lol +1 divertente -1 avrebbe dovuto essere un commento –

1

Uno dei miei momenti più imbarazzanti con un repository git, anche se è più su sed:

Sono stato una volta facendo un'operazione di find ... -exec sed -i ... in una sottodirectory di mio repository. L'ho provato senza lo -i, mi sono distratto, sono tornato e sono riuscito a passare alla directory principale del mio repository prima di eseguirlo. Ora, i file importanti di git sono tutti di sola lettura, ma sed -i di default mischia via il file rinominandolo e poi scrive nuovamente nell'originale, quindi funziona bene su un file di sola lettura come gli oggetti di git. La sostituzione non era reversibile e ho dovuto recuperare il repository clonando e recuperando da qualcuno che monitorava il mio come remoto.

Non ho mai nemmeno pensato per un momento che sed potesse funzionare su file di sola lettura. Morale della trama: utilizzare sed -i -c, che copia il file, quindi tenta di sovrascrivere l'originale.

7

Pubblicare su repository pubblico senza rendersi conto che il mio git config user.name non era corretto.
Ciò significa che il repository pubblico ora riceve un nome (e un'email) che preferirei non pubblicare affatto. Se il repository viene replicato, ... è troppo tardi.

è per questo che io preferisco avere il mio user.name visualizzata nel mio git prompt della shell, cioè invece di avere questo:

MY_HOSTNAME /c/Prog/myGitProject (master)$ 

vedo questo:

MY_HOSTNAME /c/Prog/myGitProject (master) VonC $ 

so chi sono io dal primo comando che scrivo in questa sessione di bas Git!

+0

L'impostazione di un nome utente globale che stai bene con tende a evitare che. – Kzqai

+0

@Tchalvak: sì, ma si hanno diversi repository locali, ognuno dei quali ha bisogno di un nome * diverso * per spingere i rispettivi repository upstream (remoti) ... una variabile globale non è sufficiente. – VonC

+0

Certo, ma si tratta di impostare un nome/una e-mail di default che non si hanno problemi con l'essere resi pubblici, e usando solo quelli più sensibili in casi specifici. * alza le spalle * – Kzqai

2

lavoro lavoro lavoro ...

git commit 

Lavoro lavoro lavoro ...

git commit 

Hm ...tempo di integrare

git rebase -i origin/master 

Cosa? I conflitti? Cominciamo di nuovo

git reset --hard origin/master 

Cry cry cry ...


Git permette di pulire la vostra storia locale senza rimorsi. Il più grande trucco è che è è la rete di sicurezza.

+7

Bene, evviva per 'git reflog' quindi. :) – Bombe

+0

'git reflog' mi permette di vedere i commit abbandonati? Elenca solo attività e ho effettuato un 'reset --hard' (ha aggiornato la risposta, non era corretto). –

+0

'git reset --hard' è uno dei principali modi in cui è effettivamente possibile spararsi ai piedi. Come tale, non lo uso più. Io semplicemente 'git reset HEAD ~ 1' e quindi' git checkout' su singoli file se necessario. – Kzqai

5
  1. Solo rendersi conto che hai forgotten an entry in .gitignore una volta che hai le partite sparsi in un carico di rami.

  2. Dimenticando che git add non aggiunge quello che non c'è ...

     
    git add . 
    git commit 
    git status 
    //hey! why didn't it commit my deletes?, Oh yeah, silly me 
    git add -u 
    git commit --amend 
    

  3. Se fate una git branch list, si ottiene un nuovo ramo chiamato list, ma se si fa un git stash, si ottiene lo spazio di lavoro nascosto ; per scorta, è necessità il list se si desidera che l'elenco ...

Più presto, probabilmente ...

+2

Apparentemente c'è git add -A che fa entrambi – Benjol

+0

Ma cosa intendi con "cosa non c'è"? –

3
  1. Lavoro lavoro lavoro
  2. Stash cambia
  3. Fetch ultima
  4. Rebase
  5. Ottenere conflitti, risolverli
  6. dimenticare di "git rebase --continue"
  7. Pop scorta
  8. Realizzare ho dimenticato di "git rebase --continue"
  9. git rebase --abort
  10. cambiamenti che ho messo da parte in origine - pfffft, andato .
+0

Ewwww, è terribile. –

+6

No, è un fastidio secondario. La tua scorta è ancora nel tuo repository, devi solo trovarla. Se hai ancora l'hash visualizzato nella sessione della tua console, eccoti! In caso contrario, utilizzare 'git fsck' per individuarlo. Vedi questa risposta SO per maggiori dettagli: http://stackoverflow.com/questions/89332/recover-dropped-stash-in-git –

0

Creare una nuova filiale:

git branch new-branch 

lavoro, commettere, il lavoro ... realizzare tutto il mio lavoro è il padrone, non sulla nuova filiale.

avrei dovuto fare:

git checkout -b new-branch 

Perché non riesco a fare qualcosa di simile:

git branch -c new-branch 

(c per cassa) con la possibilità di far si che il comportamento di default ???

0

Lavoro lavoro. Inizia la messa in scena di una modifica. Nota che non vuoi tutto impegnato. Effettua un commit parziale con attenzione.

Eventualmente decidere che questo non è pronto per il ramo corrente. Voglio commettere le modifiche graduali in un nuovo ramo temporaneo. Sembra così banale concettualmente, giusto?

Google per come procedere. Risposta in alto dice stash, checkout -b newbranch, stash pop. Fai questo a malincuore, chiedendoti perché non c'è un modo più semplice.

Trova che questo ha completamente cancellato la distinzione tra i cambiamenti in scena e quelli non modificati. Grazie, Git!

+0

Lavoro lavoro lavoro. Esegui un commit parziale dolorosamente accurato su più iterazioni di 'git status',' git diff' e 'git add'. Decidi che hai finito, 'git commit -a'. Wupwhaa :( – damian

Problemi correlati