2014-11-25 9 views
9
A-B-C Master 
\D-E Feature 

Dopo l'esecuzione di un comando rebasegit checkout feature ->git rebase master tutti i miei impegna da feature ramo scompare così ho A-B-C commit. Il ramo feature si presenta come master dopo la ridefinizione. Anche il rebasing non dà alcun errore, ma non mostra il messaggio 'commit to replayed' che penso di solito mostri durante la ridefinizione. Sai cosa potrebbe aver causato questo comportamento?commit dispersi dopo git aggiustano il

Una volta che ho notato che i miei commit sono scomparsi ho eseguito il seguente comando per trovare il codice mancante nella cronologia git: git rev-list --all | xargs git grep expression Questo comando ha restituito un hash di commit ma questo hash non era presente quando eseguo git log (a causa di rebase). Se faccio git reset --hard missing-hash posso vedere di nuovo il codice originale (corretto) feature. L'esecuzione di rebase master ricrea nuovamente lo stesso problema.

EDIT: Ho appena notato ho alcuni extra, come si impegna WIP on commit-message e index on commit-message quando lo faccio git reset --hard missing-hash Può essere collegato con git stash/git stash apply

+1

ahh, prova questo: http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html – unixmiah

+0

So come recuperare i miei file. Funziona anche "Unisci master". Voglio scoprire che cosa potrebbe aver causato un simile comportamento del comando rebase – jonasnas

+0

Sono quei commit D ed E in qualche modo identici nel loro contenuto ai commit del master? (nel qual caso, sarebbero saltati durante un rebase) – VonC

risposta

5

Proprio così erano sulla stessa pagina su come rebases lavoro. Nel tuo esempio, git sta fondamentalmente cercando di aggiungere e D ed E dopo C uno per uno. Il rebase si impegna su D & E non saranno gli originali, ma saranno cloni con nuovi hash. L'originale esisterà ancora, ma semplicemente penzolerà senza branch che faccia riferimento a loro (la garbage collection li cancellerà alla fine). Dopo un rebase, è possibile vedere la versione "originale" dei commit rebased guardando git log ORIG_HEAD

Tuttavia, le eccezioni possono aver luogo in questo processo. Git salterà in modo intelligente tutti i commit che sono già nella "base" (master, in questo caso) - questo può accadere che un ramo venga unito, ripristinato e quindi rimesso in sequenza.

Salterà inoltre qualsiasi commit se trova che i commit che vengono aggiunti alla base corrispondano identicamente, nel loro contenuto - commits che sono già nella cronologia - anche se gli hash sono diversi - questo può accadere se un branch è uniti, rebase, quindi uniti di nuovo.

Sospetto di una di alcune situazioni.

  1. Il ramo di funzione potrebbe essere già stato unito al master.
  2. Il ramo di funzione corrisponde già al master.

1) --contains filiali git dispongono

Questo elencherà tutti i settori che contengono il vostro ramo di caratteristica nella loro storia. Se il master è in tale elenco, il tuo ramo è già unito. Niente da fare qui.

Ci sono alcuni motivi per cui questo potrebbe non sembrare giusto.

Una ragione è che potresti non vedere le modifiche nel codice master corrente. Questo potrebbe essere per alcune ragioni. Se il ramo è stato precedentemente unito a master e poi ripristinato, i commit sono già lì, ma vengono annullati, anche se i messaggi ripristinati non vengono restituiti, è necessario ripristinare l'effettivo commit di ripristino.

2) funzione di checkout git; git rebase --keep-empty feature

Il --keep-empty costringerà git a mantenere i tuoi commit anche se non contengono alcun contenuto "nuovo" o modifiche. Questa non è una soluzione o una soluzione alternativa, ma se vedi questi commit nella tua cronologia dopo aver fatto ciò, significa che il tuo commit non viene perso. Vengono saltati intenzionalmente. Puoi decidere tu stesso se vuoi mantenere quelli vuoti.

Se questo è il caso, quindi vorrei vedere se questo ramo è stato unito in passato. Ad esempio, potrebbe essere stato unito come parte di un altro ramo. Forse Bob pensava di aver bisogno del tuo lavoro dal ramo feature nel suo ramo bobs_feature - il suo ramo l'ha fatto da padrone prima del tuo e ora il tuo ramo è sostanzialmente irrilevante. Un altro caso potrebbe essere che è stato fuso in passato in master, e quindi ripristinato. La risposta qui è di ripristinare il ripristino commit stesso - un po 'come riscattare il colpo dopo aver colpito un annullamento.

+0

Grazie per aver spiegato i possibili motivi. Il flusso di lavoro che seguo è creare un ramo di funzionalità dal master per ogni ticket di jira. Poi rebase la funzione regolarmente quando altri ticket (i miei o altri) sono stati uniti nel master. Se ho alcune modifiche in corso, faccio un git stash-> rebase master-> git stash apply.Im abbastanza sicuro che ho fatto smth che non è quello che pensavo stavo facendo. Forse applicato stash sul ramo sbagliato o smth altro (se non nuovo non chiederei). Da cosa tu questo sembra molto probabile: 'Se il ramo è stato precedentemente unito a master e poi ripristinato, i commit sono già lì ma negati' – jonasnas

+0

E su questa funzione ho fatto diversi "rebase" dal master di sicuro. – jonasnas

+0

Cercherò di passare attraverso git history/reflog per verificare se riesco a capire se è successo smth che hai menzionato. Ma contiene troppi rami e si impegna quindi è abbastanza difficile/richiede tempo. Almeno ora ho la più pallida idea di cosa sarebbe potuto accadere invece di essere senza tracce la prossima volta che lo vedo (non è stata la prima volta per me) – jonasnas