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.
- Il ramo di funzione potrebbe essere già stato unito al master.
- 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.
ahh, prova questo: http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html – unixmiah
So come recuperare i miei file. Funziona anche "Unisci master". Voglio scoprire che cosa potrebbe aver causato un simile comportamento del comando rebase – jonasnas
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